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

# Update workflow

> <Info>This API is in beta. Endpoints, fields, and behavior may still change, so avoid depending on it in production.</Info>

Updates a workflow. Send only the fields you want to change.

Anything you leave out keeps its stored value, so a rename is just `{"name": "..."}`. Changing `definition` saves a new immutable version and the workflow runs it from then on; earlier versions stay readable through [List workflow versions](/api-reference/list-workflow-versions). Pass `change_summary` to label what changed.

Renaming to a name another live workflow already uses returns a 409. An invalid definition returns a 422 with the validation errors, and nothing is saved.

Updating does not change whether the workflow is running. It also rewrites the workflow's file in the app's code.

This endpoint is limited to 30 requests per minute.

<Warning>The response includes fields beyond the ones documented here. Don't rely on undocumented response fields, as they can change at any time. Send only the fields documented here. Other request fields are not supported and their behavior can change.</Warning>



## OpenAPI

````yaml /developers/references/app-management/app-management-openapi.json put /api/apps/{app_id}/workflows/{workflow_id}
openapi: 3.1.0
info:
  title: Base44 App Management API
  version: 1.0.0
servers:
  - url: https://app.base44.com
security:
  - ApiKeyAuth: []
paths:
  /api/apps/{app_id}/workflows/{workflow_id}:
    put:
      summary: Update workflow
      description: >-
        <Info>This API is in beta. Endpoints, fields, and behavior may still
        change, so avoid depending on it in production.</Info>


        Updates a workflow. Send only the fields you want to change.


        Anything you leave out keeps its stored value, so a rename is just
        `{"name": "..."}`. Changing `definition` saves a new immutable version
        and the workflow runs it from then on; earlier versions stay readable
        through [List workflow versions](/api-reference/list-workflow-versions).
        Pass `change_summary` to label what changed.


        Renaming to a name another live workflow already uses returns a 409. An
        invalid definition returns a 422 with the validation errors, and nothing
        is saved.


        Updating does not change whether the workflow is running. It also
        rewrites the workflow's file in the app's code.


        This endpoint is limited to 30 requests per minute.


        <Warning>The response includes fields beyond the ones documented here.
        Don't rely on undocumented response fields, as they can change at any
        time. Send only the fields documented here. Other request fields are not
        supported and their behavior can change.</Warning>
      operationId: update_workflow_api_apps__app_id__workflows__workflow_id__put
      parameters:
        - name: app_id
          in: path
          required: true
          schema:
            type: string
            description: ID of the app whose workflows you want to work with.
            title: App Id
          description: ID of the app whose workflows you want to work with.
          example: 6820f3a4e7b91d003c45a1f2
        - name: workflow_id
          in: path
          required: true
          schema:
            type: string
            description: >-
              ID of the workflow, as returned in `id` by [List
              workflows](/api-reference/list-workflows).
            title: Workflow Id
          description: >-
            ID of the workflow, as returned in `id` by [List
            workflows](/api-reference/list-workflows).
          example: 68b1c0d4e7b91d003c45a1f2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateWorkflowRequest'
      responses:
        '200':
          description: The updated workflow.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WorkflowResponse'
        '401':
          description: Missing or invalid credentials.
        '402':
          description: >-
            This workspace's plan does not include workflows. Upgrade to Builder
            or above.
        '403':
          description: >-
            You don't have access to this app, the app does not exist, the app
            still runs the older automations engine instead of workflows, or you
            used a workspace API key. A missing app and an app you cannot reach
            are deliberately the same answer.
        '404':
          description: There is no workflow with this ID on this app.
        '409':
          description: Another workflow on this app already uses this name.
        '422':
          description: >-
            The definition or trigger is not valid. The body lists what is
            wrong.
components:
  schemas:
    UpdateWorkflowRequest:
      properties:
        name:
          anyOf:
            - type: string
            - type: 'null'
          title: Name
          description: New name. Leave it out to keep the current one.
          example: Email me new signups
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: New description. Leave it out to keep the current one.
          example: Sends an email whenever a User record is created.
        definition:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Definition
          description: >-
            New definition. Sending one saves a new version. Leave it out to
            keep the current one.
          example:
            do: []
            document:
              dsl: 1.0.0
              name: notify
              version: 1.0.0
        trigger:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Trigger
          description: >-
            New trigger, same shape as on create. Leave it out to keep the
            current one.
          example:
            config:
              cron_expression: 0 9 * * *
              timezone: UTC
              trigger_type: scheduled
        change_summary:
          anyOf:
            - type: string
            - type: 'null'
          title: Change Summary
          description: Note describing this change, kept in the version history.
          example: Send to the ops alias instead
      type: object
      title: UpdateWorkflowRequest
    WorkflowResponse:
      properties:
        id:
          type: string
          title: Id
          description: ID of the workflow.
          example: 68b1c0d4e7b91d003c45a1f2
        app_id:
          type: string
          title: App Id
          description: ID of the app the workflow belongs to.
          example: 6820f3a4e7b91d003c45a1f2
        file_key:
          anyOf:
            - type: string
            - type: 'null'
          title: File Key
          description: >-
            Name of the workflow's file in the app's code. `null` on workflows
            saved before files were kept.
          example: email-me-new-signups
        name:
          type: string
          title: Name
          description: Name of the workflow.
          example: Email me new signups
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: What the workflow is for.
          example: Sends an email whenever a User record is created.
        status:
          type: string
          title: Status
          description: 'Whether the workflow runs: `active`, `inactive`, or `archived`.'
          example: active
        status_reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Status Reason
          description: >-
            Why Base44 stopped the workflow itself, as a fixed code:
            `consecutive_failures`, `end_condition_reached`,
            `migration_activation_failed`, or `workflows_not_available`. `null`
            when you set the status yourself.
          example: consecutive_failures
        current_version_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Current Version Id
          description: >-
            Version the workflow runs today, as the SHA-256 hash of that
            definition. `null` until a definition is saved.
          example: 9f2c1a7b3e5d84f60c1b2a9e7d4f8c3b6a5e2d1f0c9b8a7e6d5c4b3a2f1e0d9c
        trigger:
          additionalProperties: true
          type: object
          title: Trigger
          description: >-
            What starts the workflow. The trigger sits under `config`, keyed by
            `trigger_type`.
          example:
            config:
              cron_expression: 0 9 * * *
              timezone: UTC
              trigger_type: scheduled
        app_type_context:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: App Type Context
          description: Which app surface the workflow was authored against.
          example:
            app_type: user_app
        last_run_at:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Last Run At
          description: When the workflow last started running. `null` before its first run.
          example: '2026-08-25T09:12:44Z'
        last_run_status:
          anyOf:
            - type: string
            - type: 'null'
          title: Last Run Status
          description: >-
            How that run ended: `success`, `failed`, or `cancelled`. `null`
            before the first run. Note this is a different set of values from a
            run's own `status`, which reports `completed` rather than `success`.
          example: success
        consecutive_failures:
          type: integer
          title: Consecutive Failures
          description: Runs that have failed in a row. Resets on the next success.
          default: 0
          example: 0
        total_runs:
          type: integer
          title: Total Runs
          description: Runs the workflow has started, ever.
          default: 0
          example: 48
        successful_runs:
          type: integer
          title: Successful Runs
          description: Runs that finished successfully, ever.
          default: 0
          example: 44
        failed_runs:
          type: integer
          title: Failed Runs
          description: Runs that ended in an error, ever.
          default: 0
          example: 3
        created_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Created Date
          description: When the workflow was created.
          example: '2026-07-02T11:04:00Z'
        updated_date:
          anyOf:
            - type: string
              format: date-time
            - type: 'null'
          title: Updated Date
          description: When the workflow was last changed.
          example: '2026-08-20T16:31:00Z'
        created_by:
          anyOf:
            - type: string
            - type: 'null'
          title: Created By
          description: Email of whoever created the workflow.
          example: you@example.com
        definition:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Definition
          description: >-
            The steps the workflow runs, as a CNCF Serverless Workflow v1.0
            document. `null` when no version has been saved yet. Only this
            endpoint returns it; the list endpoint does not.
          example:
            do: []
            document:
              dsl: 1.0.0
              name: notify
              version: 1.0.0
      type: object
      required:
        - id
        - app_id
        - name
        - status
      title: WorkflowResponse
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: api_key
      description: Personal API key.

````