Create workflow

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

Creates a workflow and starts it running.

The new workflow is active immediately, so a scheduled trigger begins firing on its schedule and an event trigger starts listening as soon as this returns. Create it, then call Toggle workflow status if you want it paused instead.

A workflow's name is unique per app across everything that is not archived. Reusing a name is rejected.

This is only allowed from the app's main branch.

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

post/api/apps/{app_id}/workflows

Path parameters

app_idstring required

ID of the app whose workflows you want to work with.

ID of the app whose workflows you want to work with.

Request body

namestring required

Name for the workflow. Must be unique among the app's workflows that are not archived.

descriptionstring nullable

What the workflow is for, in your own words.

definitionobject required

The steps to run, as a CNCF Serverless Workflow v1.0 document. Check it with Validate a workflow definition first.

triggerobject required

What starts the workflow. The trigger goes inside config, whose trigger_type picks the kind and whose remaining fields configure it. Add a top-level condition to skip a dispatch unless a jq expression over the payload is truthy.

change_summarystring nullable

Note describing this version, kept in the workflow's version history.

Example request

{
  "name": "Email me new signups",
  "description": "Sends an email whenever a User record is created.",
  "definition": {
    "do": [],
    "document": {
      "dsl": "1.0.0",
      "name": "notify",
      "version": "1.0.0"
    }
  },
  "trigger": {
    "config": {
      "cron_expression": "0 9 * * *",
      "timezone": "UTC",
      "trigger_type": "scheduled"
    }
  },
  "change_summary": "Initial version"
}

Response

The created workflow.

idstring required

ID of the workflow.

app_idstring required

ID of the app the workflow belongs to.

file_keystring nullable

Name of the workflow's file in the app's code. This is null on workflows saved before files were kept.

namestring required

Name of the workflow.

descriptionstring nullable

What the workflow is for.

statusstring required

Whether the workflow runs: active, inactive, or archived. See Workflow status for what each means and how it changes.

status_reasonstring nullable

Why Base44 changed the workflow's status on its own, as one of consecutive_failures, end_condition_reached, migration_activation_failed, or workflows_not_available. This is null when you changed the status yourself. See Workflow status for what each code means.

current_version_idstring nullable

Version the workflow runs today, as the SHA-256 hash of that definition. This is null until a definition is saved.

triggerobject

What starts the workflow. The trigger sits under config, keyed by trigger_type.

app_type_contextobject nullable

Caller-specific context captured when the workflow was created, such as the conversation that authored it. This API never sets it, so a workflow you create through it starts with null. Updating a workflow through this API doesn't clear an existing value either, so a workflow originally authored through the Base44 builder or a superagent keeps its context here even after an API update.

last_run_atstring date-time nullable

When the workflow last started running, as an ISO 8601 UTC timestamp. This is null before its first run.

last_run_statusstring nullable

How the workflow's most recent run ended: success, failed, or cancelled. This is null before the first run. See Workflow status for how this compares to a run's own status.

consecutive_failuresinteger

Runs that have failed in a row. Resets on the next success.

total_runsinteger

Runs the workflow has started, ever.

successful_runsinteger

Runs that finished successfully, ever.

failed_runsinteger

Runs that ended in an error, ever.

created_datestring date-time nullable

When the workflow was created, as an ISO 8601 UTC timestamp.

updated_datestring date-time nullable

When the workflow was last changed, as an ISO 8601 UTC timestamp.

created_bystring nullable

Email of whoever created the workflow.

definitionobject nullable

The steps the workflow runs, as a CNCF Serverless Workflow v1.0 document. This is null when no version has been saved yet. Only this endpoint returns it. List workflows leaves it out.

Example response

{
  "id": "68b1c0d4e7b91d003c45a1f2",
  "app_id": "6820f3a4e7b91d003c45a1f2",
  "file_key": "email-me-new-signups",
  "name": "Email me new signups",
  "description": "Sends an email whenever a User record is created.",
  "status": "active",
  "status_reason": "consecutive_failures",
  "current_version_id": "9f2c1a7b3e5d84f60c1b2a9e7d4f8c3b6a5e2d1f0c9b8a7e6d5c4b3a2f1e0d9c",
  "trigger": {
    "config": {
      "cron_expression": "0 9 * * *",
      "timezone": "UTC",
      "trigger_type": "scheduled"
    }
  },
  "app_type_context": {
    "anchor_message_id": "68b1c0d4e7b91d003c45a1f2",
    "conversation_id": "0195f2a1-4c3e-7b21-9f0d-2a5c8e1b4d77"
  },
  "last_run_at": "2026-08-25T09:12:44Z",
  "last_run_status": "success",
  "total_runs": 48,
  "successful_runs": 44,
  "failed_runs": 3,
  "created_date": "2026-07-02T11:04:00Z",
  "updated_date": "2026-08-20T16:31:00Z",
  "created_by": "you@example.com",
  "definition": {
    "do": [],
    "document": {
      "dsl": "1.0.0",
      "name": "notify",
      "version": "1.0.0"
    }
  }
}

Changes

Changed in 1 of the 14 revisions of this API.1