> ## Documentation Index
> Fetch the complete documentation index at: https://loops.so/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Update a workflow node

> Update workflow-node-owned fields for a single node.

Shared resources such as email messages and audience segments should be updated through their own APIs.


## OpenAPI

````yaml /openapi.json post /v1/workflows/{workflowId}/nodes/{nodeId}
openapi: 3.1.0
info:
  title: Loops OpenAPI Spec
  description: This is the OpenAPI Spec for the [Loops API](https://loops.so/docs/api).
  version: 1.20.0
servers:
  - url: https://app.loops.so/api
security: []
tags:
  - name: API key
  - name: Audience segments
    description: View audience segments
  - name: Campaigns
    description: Create and manage email campaigns
  - name: Campaign groups
    description: Organize campaigns into groups
  - name: Components
    description: View email components
  - name: Configuration
    description: View configuration settings
  - name: Contacts
    description: Manage contacts in your audience
  - name: Contact properties
    description: Manage contact properties
  - name: Email messages
    description: Manage email message content for campaigns
  - name: Events
    description: Trigger workflows with events
  - name: Event patterns
    description: View workflow event patterns
  - name: Mailing lists
    description: View mailing lists
  - name: Themes
    description: View email themes
  - name: Transactional emails
    description: Create, manage, and send transactional emails
  - name: Transactional groups
    description: Organize transactional emails into groups
  - name: Uploads
    description: Upload image assets
  - name: Workflows
    description: View and mutate workflow graphs
  - name: Workflow nodes
    description: View and mutate workflow nodes
paths:
  /v1/workflows/{workflowId}/nodes/{nodeId}:
    parameters:
      - name: workflowId
        in: path
        required: true
        description: The ID of the workflow.
        schema:
          type: string
      - name: nodeId
        in: path
        required: true
        description: The ID of the workflow node.
        schema:
          type: string
    post:
      tags:
        - Workflow nodes
      summary: Update a workflow node
      description: >-
        Update workflow-node-owned fields for a single node. Shared resources
        such as email messages and audience segments should be updated through
        their own APIs.
      operationId: updateWorkflowNode
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateWorkflowNodeRequest'
      responses:
        '200':
          description: Workflow node updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateWorkflowNodeResponse'
        '400':
          description: Invalid `workflowId`, `nodeId`, request body, or node update.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowFailureResponse'
        '401':
          description: Invalid API key or workflow API not enabled for this team.
        '404':
          description: Workflow or workflow node not found.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowFailureResponse'
        '405':
          description: Wrong HTTP request method.
        '409':
          description: '`expectedRevisionId` is stale.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowFailureResponse'
        '501':
          description: This node update is not implemented.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowFailureResponse'
      security:
        - apiKey: []
components:
  schemas:
    UpdateWorkflowNodeRequest:
      type: object
      properties:
        expectedRevisionId:
          $ref: '#/components/schemas/WorkflowExpectedRevisionId'
        payload:
          $ref: '#/components/schemas/UpdateWorkflowNodePayload'
      required:
        - expectedRevisionId
        - payload
      additionalProperties: false
    UpdateWorkflowNodeResponse:
      description: The updated workflow node. The exact fields depend on `typeName`.
      oneOf:
        - $ref: '#/components/schemas/SignupTriggerWorkflowMutationNodeWithRevision'
        - $ref: '#/components/schemas/EventTriggerWorkflowMutationNodeWithRevision'
        - $ref: >-
            #/components/schemas/ContactPropertyTriggerWorkflowMutationNodeWithRevision
        - $ref: >-
            #/components/schemas/AddToListTriggerWorkflowMutationNodeWithRevision
        - $ref: '#/components/schemas/AudienceFilterWorkflowMutationNodeWithRevision'
        - $ref: '#/components/schemas/TimerActionWorkflowMutationNodeWithRevision'
        - $ref: >-
            #/components/schemas/ExperimentBranchWorkflowMutationNodeWithRevision
        - $ref: '#/components/schemas/VariantWorkflowMutationNodeWithRevision'
      discriminator:
        propertyName: typeName
        mapping:
          SignupTrigger:
            $ref: '#/components/schemas/SignupTriggerWorkflowMutationNodeWithRevision'
          EventTrigger:
            $ref: '#/components/schemas/EventTriggerWorkflowMutationNodeWithRevision'
          ContactPropertyTrigger:
            $ref: >-
              #/components/schemas/ContactPropertyTriggerWorkflowMutationNodeWithRevision
          AddToListTrigger:
            $ref: >-
              #/components/schemas/AddToListTriggerWorkflowMutationNodeWithRevision
          AudienceFilter:
            $ref: >-
              #/components/schemas/AudienceFilterWorkflowMutationNodeWithRevision
          TimerAction:
            $ref: '#/components/schemas/TimerActionWorkflowMutationNodeWithRevision'
          ExperimentBranchNode:
            $ref: >-
              #/components/schemas/ExperimentBranchWorkflowMutationNodeWithRevision
          VariantNode:
            $ref: '#/components/schemas/VariantWorkflowMutationNodeWithRevision'
    WorkflowFailureResponse:
      type: object
      properties:
        message:
          type: string
      required:
        - message
    WorkflowExpectedRevisionId:
      type: string
      description: >-
        The workflow revision token returned by the latest workflow read or
        mutation. Mutations reject stale values.
    UpdateWorkflowNodePayload:
      anyOf:
        - $ref: '#/components/schemas/WorkflowSignupTriggerPayload'
        - $ref: '#/components/schemas/WorkflowEventTriggerPayload'
        - $ref: '#/components/schemas/WorkflowContactPropertyTriggerPayload'
        - $ref: '#/components/schemas/WorkflowAddToListTriggerPayload'
        - $ref: '#/components/schemas/WorkflowAudienceFilterPayload'
        - $ref: '#/components/schemas/WorkflowTimerActionPayload'
        - $ref: '#/components/schemas/WorkflowExperimentBranchPayload'
        - $ref: '#/components/schemas/WorkflowVariantPayload'
      description: >-
        Node-type-specific fields to update. The allowed fields depend on the
        existing node type. Trigger node updates may include `typeName` when
        changing one trigger node type to another trigger node type.
    SignupTriggerWorkflowMutationNodeWithRevision:
      allOf:
        - $ref: '#/components/schemas/SignupTriggerWorkflowMutationNode'
        - $ref: '#/components/schemas/WorkflowMutationNodeRevision'
    EventTriggerWorkflowMutationNodeWithRevision:
      allOf:
        - $ref: '#/components/schemas/EventTriggerWorkflowMutationNode'
        - $ref: '#/components/schemas/WorkflowMutationNodeRevision'
    ContactPropertyTriggerWorkflowMutationNodeWithRevision:
      allOf:
        - $ref: '#/components/schemas/ContactPropertyTriggerWorkflowMutationNode'
        - $ref: '#/components/schemas/WorkflowMutationNodeRevision'
    AddToListTriggerWorkflowMutationNodeWithRevision:
      allOf:
        - $ref: '#/components/schemas/AddToListTriggerWorkflowMutationNode'
        - $ref: '#/components/schemas/WorkflowMutationNodeRevision'
    AudienceFilterWorkflowMutationNodeWithRevision:
      allOf:
        - $ref: '#/components/schemas/AudienceFilterWorkflowMutationNode'
        - $ref: '#/components/schemas/WorkflowMutationNodeRevision'
    TimerActionWorkflowMutationNodeWithRevision:
      allOf:
        - $ref: '#/components/schemas/TimerActionWorkflowMutationNode'
        - $ref: '#/components/schemas/WorkflowMutationNodeRevision'
    ExperimentBranchWorkflowMutationNodeWithRevision:
      allOf:
        - $ref: '#/components/schemas/ExperimentBranchWorkflowMutationNode'
        - $ref: '#/components/schemas/WorkflowMutationNodeRevision'
    VariantWorkflowMutationNodeWithRevision:
      allOf:
        - $ref: '#/components/schemas/VariantWorkflowMutationNode'
        - $ref: '#/components/schemas/WorkflowMutationNodeRevision'
    WorkflowSignupTriggerPayload:
      type: object
      description: Changes an existing trigger node to a signup trigger.
      properties:
        typeName:
          type: string
          enum:
            - SignupTrigger
      required:
        - typeName
      additionalProperties: false
    WorkflowEventTriggerPayload:
      type: object
      description: >-
        Updates an event trigger, or changes an existing trigger node to an
        event trigger. Assign the event pattern with either `eventPatternId` or
        `eventName`, not both. Set either field to `null` to clear the
        event-pattern relationship.
      minProperties: 1
      properties:
        typeName:
          type: string
          enum:
            - EventTrigger
        eventPatternId:
          type:
            - string
            - 'null'
          description: >-
            The ID of the event pattern to trigger on. Use either
            `eventPatternId` or `eventName`, not both. Set to `null` to clear
            the event-pattern relationship.
        eventName:
          type:
            - string
            - 'null'
          description: >-
            The name of the event pattern to trigger on. Use this when you know
            the event name but not the internal event pattern ID. Use either
            `eventName` or `eventPatternId`, not both. Set to `null` to clear
            the event-pattern relationship.
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      additionalProperties: false
    WorkflowContactPropertyTriggerPayload:
      type: object
      description: >-
        Updates a contact-property trigger, or changes an existing trigger node
        to a contact-property trigger.
      minProperties: 1
      properties:
        typeName:
          type: string
          enum:
            - ContactPropertyTrigger
        contactPropertyQuery:
          $ref: '#/components/schemas/WorkflowContactPropertyQuery'
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      additionalProperties: false
    WorkflowAddToListTriggerPayload:
      type: object
      description: >-
        Updates an add-to-list trigger, or changes an existing trigger node to
        an add-to-list trigger.
      minProperties: 1
      properties:
        typeName:
          type: string
          enum:
            - AddToListTrigger
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      additionalProperties: false
    WorkflowAudienceFilterPayload:
      type: object
      minProperties: 1
      description: Configuration for the audience filter node.
      properties:
        audienceSegmentId:
          type:
            - string
            - 'null'
        audienceFilter:
          $ref: '#/components/schemas/AudienceFilter'
        appliesDownstream:
          description: >-
            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.
          type: boolean
      additionalProperties: false
    WorkflowTimerActionPayload:
      type: object
      minProperties: 1
      description: Configuration for the timer action node.
      properties:
        amount:
          $ref: '#/components/schemas/WorkflowTimerAmount'
        unit:
          $ref: '#/components/schemas/WorkflowTimerUnit'
      additionalProperties: false
    WorkflowExperimentBranchPayload:
      type: object
      minProperties: 1
      description: Configuration for the experiment branch node.
      properties:
        samplingRate:
          type: number
          description: >-
            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.
      additionalProperties: false
    WorkflowVariantPayload:
      type: object
      minProperties: 1
      description: Configuration for the variant node.
      properties:
        isControl:
          type: boolean
          description: >-
            Use `true` to set this variant as the control of the experiment.
            This will set `false` on the existing control, if one exists.
            Experiments do not require a control variant.
      additionalProperties: false
    SignupTriggerWorkflowMutationNode:
      type: object
      properties:
        id:
          type: string
        typeName:
          type: string
          enum:
            - SignupTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
      required:
        - id
        - typeName
        - nextNodeIds
    WorkflowMutationNodeRevision:
      type: object
      properties:
        workflowRevisionId:
          $ref: '#/components/schemas/WorkflowRevisionId'
      required:
        - workflowRevisionId
    EventTriggerWorkflowMutationNode:
      type: object
      properties:
        id:
          type: string
        typeName:
          type: string
          enum:
            - EventTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        eventName:
          type: string
          description: The name of the event pattern that triggers this node.
        eventProperties:
          type: array
          items:
            $ref: '#/components/schemas/WorkflowEventProperty'
          description: The properties of the event pattern, which can be used in emails.
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      required:
        - id
        - typeName
        - nextNodeIds
        - reEligible
    ContactPropertyTriggerWorkflowMutationNode:
      type: object
      properties:
        id:
          type: string
        typeName:
          type: string
          enum:
            - ContactPropertyTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        contactPropertyQuery:
          oneOf:
            - $ref: '#/components/schemas/WorkflowContactPropertyQuery'
            - type: 'null'
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      required:
        - id
        - typeName
        - nextNodeIds
        - contactPropertyQuery
        - reEligible
    AddToListTriggerWorkflowMutationNode:
      type: object
      properties:
        id:
          type: string
        typeName:
          type: string
          enum:
            - AddToListTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        mailingListId:
          type:
            - string
            - 'null'
          description: The ID of the mailing list this trigger sends to, if set.
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      required:
        - id
        - typeName
        - nextNodeIds
        - mailingListId
        - reEligible
    AudienceFilterWorkflowMutationNode:
      type: object
      properties:
        id:
          type: string
        typeName:
          type: string
          enum:
            - AudienceFilter
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        audienceFilter:
          $ref: '#/components/schemas/AudienceFilter'
        audienceSegmentId:
          type: string
          description: The ID of the audience segment this trigger targets.
        appliesDownstream:
          description: >-
            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.
          type: boolean
      required:
        - id
        - typeName
        - nextNodeIds
        - appliesDownstream
    TimerActionWorkflowMutationNode:
      type: object
      properties:
        id:
          type: string
        typeName:
          type: string
          enum:
            - TimerAction
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        amount:
          $ref: '#/components/schemas/WorkflowTimerAmount'
        unit:
          $ref: '#/components/schemas/WorkflowTimerUnit'
      required:
        - id
        - typeName
        - nextNodeIds
        - amount
        - unit
    ExperimentBranchWorkflowMutationNode:
      type: object
      properties:
        id:
          type: string
        typeName:
          type: string
          enum:
            - ExperimentBranchNode
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        samplingRate:
          type: number
          description: >-
            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.
      required:
        - id
        - typeName
        - nextNodeIds
        - samplingRate
    VariantWorkflowMutationNode:
      type: object
      properties:
        id:
          type: string
        typeName:
          type: string
          enum:
            - VariantNode
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        isControl:
          type: boolean
          description: Whether this is the control variant of an experiment.
      required:
        - id
        - typeName
        - nextNodeIds
    WorkflowReEligible:
      type: boolean
      description: >-
        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.
    WorkflowContactPropertyQuery:
      type: object
      description: >-
        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.
      properties:
        key:
          type: string
          description: >-
            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.
          examples:
            - firstName
            - email
            - planName
        is:
          $ref: '#/components/schemas/WorkflowContactPropertyComparison'
          description: Comparison for the new contact property value after the update.
        was:
          $ref: '#/components/schemas/WorkflowContactPropertyComparison'
          description: >-
            Comparison for the previous contact property value before the
            update.
      required:
        - key
        - is
        - was
    AudienceFilter:
      type:
        - object
        - 'null'
      description: >-
        A tree of audience conditions combined with `match`. Null when the
        campaign targets a mailing list or segment without an explicit filter.
      properties:
        match:
          type: string
          enum:
            - all
            - any
        conditions:
          type: array
          minItems: 1
          items:
            $ref: '#/components/schemas/AudienceFilterCondition'
      required:
        - match
        - conditions
      additionalProperties: false
    WorkflowTimerAmount:
      type: number
      description: >-
        The amount of time to wait before triggering the next node. Set to `0`
        to move to the next node immediately.
    WorkflowTimerUnit:
      type: string
      enum:
        - m
        - h
        - d
      description: >-
        The unit of time for the timer action node. m = minutes, h = hours, d =
        days.
    WorkflowNextNodeIds:
      type: array
      items:
        type: string
      description: The IDs of the nodes that are downstream of this node.
    WorkflowRevisionId:
      type:
        - string
      description: >-
        The current workflow revision token. Pass the latest value as
        `expectedRevisionId` on the next workflow mutation.
    WorkflowEventProperty:
      type: object
      properties:
        name:
          type: string
        type:
          type: string
          enum:
            - string
            - number
            - boolean
            - date
      required:
        - name
        - type
    WorkflowContactPropertyComparison:
      type: object
      description: >-
        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`.
      properties:
        value:
          oneOf:
            - type: string
            - type: number
            - type: boolean
        operator:
          type: string
          description: >-
            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`.
          enum:
            - 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:
        - value
        - operator
    AudienceFilterCondition:
      oneOf:
        - $ref: '#/components/schemas/PropertyCondition'
        - $ref: '#/components/schemas/OptInCondition'
        - $ref: '#/components/schemas/ActivityCondition'
      discriminator:
        propertyName: type
    PropertyCondition:
      type: object
      description: Matches contacts by a property value.
      properties:
        type:
          type: string
          enum:
            - property
        key:
          type: string
          description: The contact property name.
        operator:
          type: string
          enum:
            - any
            - contains
            - notContains
            - equals
            - notEquals
            - greaterThan
            - lessThan
            - isTrue
            - isFalse
            - empty
            - notEmpty
            - dateEmpty
            - dateNotEmpty
            - after
            - before
            - between
        value:
          description: >-
            The comparison value. Omitted for value-less operators (e.g.
            `isTrue`, `empty`). A `{ from, to }` object for `between`.
          oneOf:
            - type: string
            - type: number
            - type: object
              properties:
                from:
                  type: string
                  format: date-time
                to:
                  type: string
                  format: date-time
              required:
                - from
                - to
      required:
        - type
        - key
        - operator
    OptInCondition:
      type: object
      description: Matches contacts by mailing-list opt-in status.
      properties:
        type:
          type: string
          enum:
            - optIn
        status:
          type:
            - string
            - 'null'
          enum:
            - accepted
            - pending
            - rejected
            - null
      required:
        - type
        - status
    ActivityCondition:
      type: object
      description: Matches contacts by their activity on a campaign or workflow.
      properties:
        type:
          type: string
          enum:
            - activity
        action:
          type: string
          enum:
            - sent
            - opened
            - clicked
        negate:
          type: boolean
        target:
          type: string
          enum:
            - campaign
            - workflow
            - workflowEmail
        id:
          type: string
          description: The ID of the campaign, workflow, or workflow email.
      required:
        - type
        - action
        - negate
        - target
        - id
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer

````