---
title: "Create Workflow"
method: POST
path: "/api/workflows/"
tags: ["workflows"]
---

# Create Workflow

`POST /api/workflows/`

POST handler with superadmin-only field protection.

Strips superadmin-only fields from non-superadmin requests before
delegating to OrganizationInjectionMixin.post() for org injection.

## Headers

- `Authorization` string, required

## Request body

- WorkflowCreateRequest — Validate workflow task structure on create/update via validate_workflow_structure().
  - `id` string
  - `tasks` WorkflowCreateRequestTasksItems[]
  - `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)

## Response `201`

- WorkflowCreate — Validate workflow task structure on create/update via validate_workflow_structure().
  - `id` string
  - `unique_organization_id` string, required
  - `tasks` WorkflowCreateTasksItems[]
  - `project` string, nullable, required
  - `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_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
  - `organization` integer, nullable, required
  - `updated_by` integer, nullable, required

---

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