> ## 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

> Update a workflow's display properties.

<Info>To change a workflow's mailing list, use the [Change workflow mailing list](/docs/api-reference/change-workflow-mailing-list) endpoint instead.</Info>


## OpenAPI

````yaml /openapi.json post /v1/workflows/{workflowId}
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}:
    parameters:
      - name: workflowId
        in: path
        required: true
        description: The ID of the workflow.
        schema:
          type: string
    post:
      tags:
        - Workflows
      summary: Update a workflow
      description: >-
        Update a workflow's display properties. At least one property must be
        provided. To change the workflow's mailing list, use the
        `/v1/workflows/{workflowId}/mailing-list` endpoint instead.
      operationId: updateWorkflowProperties
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateWorkflowPropertiesRequest'
      responses:
        '200':
          description: Workflow properties updated.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SimplifiedWorkflowWithRevision'
        '400':
          description: Invalid `workflowId` or request body.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowFailureResponse'
        '401':
          description: Invalid API key or workflow API not enabled for this team.
        '404':
          description: Workflow 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'
      security:
        - apiKey: []
components:
  schemas:
    UpdateWorkflowPropertiesRequest:
      type: object
      description: At least one property must be provided.
      properties:
        expectedRevisionId:
          $ref: '#/components/schemas/WorkflowExpectedRevisionId'
        name:
          type: string
          description: The updated workflow name.
        description:
          type: string
          description: The updated workflow description.
      required:
        - expectedRevisionId
      anyOf:
        - required:
            - name
        - required:
            - description
      additionalProperties: false
    SimplifiedWorkflowWithRevision:
      allOf:
        - $ref: '#/components/schemas/SimplifiedWorkflow'
        - type: object
          properties:
            workflowRevisionId:
              $ref: '#/components/schemas/WorkflowRevisionId'
          required:
            - workflowRevisionId
    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.
    SimplifiedWorkflow:
      type: object
      properties:
        id:
          type: string
          description: The ID of the workflow.
        status:
          type: string
          enum:
            - Draft
            - Sending
            - Paused
            - PausedAndQueueing
        name:
          type: string
          description: The name of the workflow.
        description:
          type: string
          description: The description of the workflow.
        mailingListId:
          type:
            - string
            - 'null'
          description: The ID of the mailing list the workflow sends to.
        rootNodeId:
          type: string
          description: The ID of the root node in the workflow graph.
        nodes:
          type: object
          description: >-
            A map of node IDs to simplified node objects. Each node includes
            typeName and nextNodeIds, plus type-specific fields when present.
          additionalProperties:
            $ref: '#/components/schemas/SimplifiedWorkflowNode'
      required:
        - id
        - status
        - mailingListId
        - rootNodeId
        - nodes
    WorkflowRevisionId:
      type:
        - string
      description: >-
        The current workflow revision token. Pass the latest value as
        `expectedRevisionId` on the next workflow mutation.
    SimplifiedWorkflowNode:
      oneOf:
        - $ref: '#/components/schemas/SimplifiedSignupTriggerWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedEventTriggerWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedContactPropertyTriggerWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedAddToListTriggerWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedBlankTriggerWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedAudienceFilterWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedTimerActionWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedSendEmailActionWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedExitActionWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedBranchWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedExperimentBranchWorkflowNode'
        - $ref: '#/components/schemas/SimplifiedVariantWorkflowNode'
      discriminator:
        propertyName: typeName
        mapping:
          SignupTrigger:
            $ref: '#/components/schemas/SimplifiedSignupTriggerWorkflowNode'
          EventTrigger:
            $ref: '#/components/schemas/SimplifiedEventTriggerWorkflowNode'
          ContactPropertyTrigger:
            $ref: '#/components/schemas/SimplifiedContactPropertyTriggerWorkflowNode'
          AddToListTrigger:
            $ref: '#/components/schemas/SimplifiedAddToListTriggerWorkflowNode'
          BlankTrigger:
            $ref: '#/components/schemas/SimplifiedBlankTriggerWorkflowNode'
          AudienceFilter:
            $ref: '#/components/schemas/SimplifiedAudienceFilterWorkflowNode'
          TimerAction:
            $ref: '#/components/schemas/SimplifiedTimerActionWorkflowNode'
          SendEmailAction:
            $ref: '#/components/schemas/SimplifiedSendEmailActionWorkflowNode'
          ExitAction:
            $ref: '#/components/schemas/SimplifiedExitActionWorkflowNode'
          BranchNode:
            $ref: '#/components/schemas/SimplifiedBranchWorkflowNode'
          ExperimentBranchNode:
            $ref: '#/components/schemas/SimplifiedExperimentBranchWorkflowNode'
          VariantNode:
            $ref: '#/components/schemas/SimplifiedVariantWorkflowNode'
    SimplifiedSignupTriggerWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - SignupTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
      required:
        - typeName
        - nextNodeIds
      additionalProperties: false
    SimplifiedEventTriggerWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - EventTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        eventName:
          type:
            - string
            - 'null'
          description: The name of the event that triggers the workflow.
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      required:
        - typeName
        - nextNodeIds
        - eventName
        - reEligible
      additionalProperties: false
    SimplifiedContactPropertyTriggerWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - ContactPropertyTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        contactPropertyQuery:
          oneOf:
            - $ref: '#/components/schemas/WorkflowContactPropertyQuery'
            - type: 'null'
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      required:
        - typeName
        - nextNodeIds
        - contactPropertyQuery
        - reEligible
      additionalProperties: false
    SimplifiedAddToListTriggerWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - AddToListTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        mailingListId:
          type:
            - string
            - 'null'
          description: The ID of the mailing list that triggers the workflow.
        reEligible:
          $ref: '#/components/schemas/WorkflowReEligible'
      required:
        - typeName
        - nextNodeIds
        - mailingListId
        - reEligible
      additionalProperties: false
    SimplifiedBlankTriggerWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - BlankTrigger
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
      required:
        - typeName
        - nextNodeIds
      additionalProperties: false
    SimplifiedAudienceFilterWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - AudienceFilter
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
      required:
        - typeName
        - nextNodeIds
      additionalProperties: false
    SimplifiedTimerActionWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - TimerAction
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        amount:
          $ref: '#/components/schemas/WorkflowTimerAmount'
        unit:
          $ref: '#/components/schemas/WorkflowTimerUnit'
      required:
        - typeName
        - nextNodeIds
        - amount
        - unit
      additionalProperties: false
    SimplifiedSendEmailActionWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - SendEmailAction
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        emailMessageId:
          type:
            - string
            - 'null'
          description: >-
            The ID of the email message to send. To edit this email, use the
            `POST /v1/email-messages/{emailMessageId}` endpoint.
        subject:
          type: string
          description: The subject of the email message (reference only).
      required:
        - typeName
        - nextNodeIds
        - emailMessageId
        - subject
      additionalProperties: false
    SimplifiedExitActionWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - ExitAction
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
      required:
        - typeName
        - nextNodeIds
      additionalProperties: false
    SimplifiedBranchWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - BranchNode
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
      required:
        - typeName
        - nextNodeIds
      additionalProperties: false
    SimplifiedExperimentBranchWorkflowNode:
      type: object
      properties:
        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.
      required:
        - typeName
        - nextNodeIds
        - samplingRate
      additionalProperties: false
    SimplifiedVariantWorkflowNode:
      type: object
      properties:
        typeName:
          type: string
          enum:
            - VariantNode
        nextNodeIds:
          $ref: '#/components/schemas/WorkflowNextNodeIds'
        isControl:
          type: boolean
          description: Whether this is the control variant of an experiment.
      required:
        - typeName
        - nextNodeIds
        - isControl
      additionalProperties: false
    WorkflowNextNodeIds:
      type: array
      items:
        type: string
      description: The IDs of the nodes that are downstream of this node.
    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
    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.
    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
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer

````