---
title: "Update Workflow"
method: PATCH
path: "/api/workflows/{workflow_id}/"
tags: ["workflows"]
---

# Update Workflow

`PATCH /api/workflows/{workflow_id}/`

Edit the workflow. Structural edits on committed-only families return 409.

## Path parameters

- `workflow_id` string, required

## Headers

- `Authorization` string, required

## Request body

- PatchedWorkflowUpdateRequest — Validate workflow task structure on create/update via validate_workflow_structure().
  - `tasks` PatchedWorkflowUpdateRequestTasksItems[]
  - `workflow_id` string — Logical workflow family key shared across versions
  - `version` integer
  - `name` string, nullable
  - `description` string, nullable
  - `type` 'automations' | 'monitors' | 'evaluators' | 'reports' | 'exports' | 'ingests' — * `automations` - Automation * `monitors` - Monitor * `evaluators` - Evaluator * `reports` - Report * `exports` - Export * `ingests` - Ingest
  - `trigger_event_type` union — Event type that triggers this workflow when used as an event responder * `request_log` - LOG_INGESTED * `trace_completed` - TRACE_COMPLETED * `customer_budget_limit_reached` - BUDGET_EXCEEDED * `credit_low_balance_threshold_reached` - CREDIT_LOW * `spend_cap_warning_threshold_reached` - SPEND_CAP_WARNING * `limit_policy_soft_triggered` - LIMIT_POLICY_SOFT_TRIGGERED * `limit_policy_hard_triggered` - LIMIT_POLICY_HARD_TRIGGERED * `on_eval_result_ingested` - EVAL_COMPLETED * `custom_event` - CUSTOM_EVENT * `eval_only` - EVAL_ONLY * `scheduled` - SCHEDULED
    - 'request_log' | 'trace_completed' | 'customer_budget_limit_reached' | 'credit_low_balance_threshold_reached' | 'spend_cap_warning_threshold_reached' | 'limit_policy_soft_triggered' | 'limit_policy_hard_triggered' | 'on_eval_result_ingested' | 'custom_event' | 'eval_only' | 'scheduled' — * `request_log` - LOG_INGESTED * `trace_completed` - TRACE_COMPLETED * `customer_budget_limit_reached` - BUDGET_EXCEEDED * `credit_low_balance_threshold_reached` - CREDIT_LOW * `spend_cap_warning_threshold_reached` - SPEND_CAP_WARNING * `limit_policy_soft_triggered` - LIMIT_POLICY_SOFT_TRIGGERED * `limit_policy_hard_triggered` - LIMIT_POLICY_HARD_TRIGGERED * `on_eval_result_ingested` - EVAL_COMPLETED * `custom_event` - CUSTOM_EVENT * `eval_only` - EVAL_ONLY * `scheduled` - SCHEDULED
    - ''
    - unknown
  - `schedule_cron` string, nullable — UTC cron schedule (5-field). Populated when trigger_event_type='scheduled'.
  - `has_async_steps` boolean
  - `is_starred` boolean
  - `resource_ids` string[] — All resource IDs referenced in workflow (for reverse lookup)
  - `updated_by` integer, nullable

## Response `200`

- WorkflowUpdate — Validate workflow task structure on create/update via validate_workflow_structure().
  - `id` string, required
  - `tasks` WorkflowUpdateTasksItems[]
  - `project` string, nullable, required
  - `workflow_id` string — Logical workflow family key shared across versions
  - `version` integer
  - `name` string, nullable
  - `description` string, nullable
  - `unique_organization_id` string, required
  - `type` 'automations' | 'monitors' | 'evaluators' | 'reports' | 'exports' | 'ingests' — * `automations` - Automation * `monitors` - Monitor * `evaluators` - Evaluator * `reports` - Report * `exports` - Export * `ingests` - Ingest
  - `trigger_event_type` union — Event type that triggers this workflow when used as an event responder * `request_log` - LOG_INGESTED * `trace_completed` - TRACE_COMPLETED * `customer_budget_limit_reached` - BUDGET_EXCEEDED * `credit_low_balance_threshold_reached` - CREDIT_LOW * `spend_cap_warning_threshold_reached` - SPEND_CAP_WARNING * `limit_policy_soft_triggered` - LIMIT_POLICY_SOFT_TRIGGERED * `limit_policy_hard_triggered` - LIMIT_POLICY_HARD_TRIGGERED * `on_eval_result_ingested` - EVAL_COMPLETED * `custom_event` - CUSTOM_EVENT * `eval_only` - EVAL_ONLY * `scheduled` - SCHEDULED
    - 'request_log' | 'trace_completed' | 'customer_budget_limit_reached' | 'credit_low_balance_threshold_reached' | 'spend_cap_warning_threshold_reached' | 'limit_policy_soft_triggered' | 'limit_policy_hard_triggered' | 'on_eval_result_ingested' | 'custom_event' | 'eval_only' | 'scheduled' — * `request_log` - LOG_INGESTED * `trace_completed` - TRACE_COMPLETED * `customer_budget_limit_reached` - BUDGET_EXCEEDED * `credit_low_balance_threshold_reached` - CREDIT_LOW * `spend_cap_warning_threshold_reached` - SPEND_CAP_WARNING * `limit_policy_soft_triggered` - LIMIT_POLICY_SOFT_TRIGGERED * `limit_policy_hard_triggered` - LIMIT_POLICY_HARD_TRIGGERED * `on_eval_result_ingested` - EVAL_COMPLETED * `custom_event` - CUSTOM_EVENT * `eval_only` - EVAL_ONLY * `scheduled` - SCHEDULED
    - ''
    - unknown
  - `schedule_cron` string, nullable — UTC cron schedule (5-field). Populated when trigger_event_type='scheduled'.
  - `has_async_steps` boolean
  - `is_enabled` boolean, required — Only committed (is_read_only=True) versions may be enabled. At most one version per workflow family should be enabled at a time.
  - `is_starred` boolean
  - `is_read_only` boolean, required — True for committed versions; only the latest version is editable
  - `resource_ids` string[] — All resource IDs referenced in workflow (for reverse lookup)
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `updated_by` integer, nullable

---

[API](https://skmtc.net/keywordsai/apis/api-reference.md) · [All operations](https://skmtc.net/keywordsai/apis/api-reference/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/keywordsai/api-reference/versions/c26d550029f8/schema)
