---
title: "Create a workflow"
method: POST
path: "/workflows"
tags: ["Workflows"]
---

# Create a workflow

`POST /workflows`

## Request

- Base URL: `https://app.italic.com/api/v2`
- URL: `https://app.italic.com/api/v2/workflows`
- Auth: HTTP bearer

Required permission: workflows:manage. A Send webhook action with a new `url` also needs webhooks:manage; its signing secret is returned once, in `secrets`. An account can have 20 workflows.

## Headers

- `Idempotency-Key` string, required

## Request body

- WorkflowInput
  - `name` string, required
  - `enabled` boolean: Defaults to true.
  - `trigger` object, required: Which new recordings start the workflow. Every condition given must match.
    - `type` 'recording', required
    - `phrases` string[]: Words that start the workflow. Empty: any words, so input or kind must narrow it.
    - `match` 'anywhere' | 'start': `start`: the transcript must begin with a phrase. `anywhere`: a phrase anywhere in it.
    - `input` 'hold' | 'doubleTap' | 'tripleTap' | 'recordButton' | 'pushToTalk' | 'appRecord', nullable: Only recordings from this device input. Null or omitted: any input.
    - `kind` 'clip' | 'memo', nullable: Only Clips or only Memos. Null or omitted: both.
  - `actions` object[], required
    - `id` string, required: Unique within the workflow; later actions use it in `{{<id>.<output>}}` variables.
    - `type` 'ai' | 'agent' | 'send_email' | 'create_event' | 'create_reminder' | 'send_slack_message' | 'send_webhook' | 'create_notion_page' | 'append_to_notion_page' | 'save_to_drive' | 'create_linear_issue' | 'comment_on_linear_issue' | 'update_linear_issue' | 'run_connector_tool', required
    - `approval` 'ask' | 'auto': `ask`: the action waits in Tasks. `auto`: it runs. Write with AI (`ai`) has none.

## Response `200`

Success. Writes without read permission return an ID and revision only.

- WorkflowResult
  - `workflow` Workflow, required
    - `id` string, required
    - `name` string, required
    - `enabled` boolean, required
    - `trigger` object, required
      - `type` 'recording', required
      - `phrases` string[], required
      - `match` 'anywhere' | 'start', required
      - `input` 'hold' | 'doubleTap' | 'tripleTap' | 'recordButton' | 'pushToTalk' | 'appRecord', nullable, required
      - `kind` 'clip' | 'memo', nullable, required
    - `actions` object[], required
      - `id` string, required: Unique within the workflow; later actions use it in `{{<id>.<output>}}` variables.
      - `type` 'ai' | 'agent' | 'send_email' | 'create_event' | 'create_reminder' | 'send_slack_message' | 'send_webhook' | 'create_notion_page' | 'append_to_notion_page' | 'save_to_drive' | 'create_linear_issue' | 'comment_on_linear_issue' | 'update_linear_issue' | 'run_connector_tool', required
      - `approval` 'ask' | 'auto': `ask`: the action waits in Tasks. `auto`: it runs. Write with AI (`ai`) has none.
    - `createdAt` integer, required
    - `updatedAt` integer, required
  - `secrets` object[]: Signing secrets of webhooks this request added, shown once.
    - `actionIndex` integer, required
    - `url` string, required
    - `secret` string, required
  - `replayed` boolean

## Other responses

- `default`: Request failed. Errors include a stable code and a readable message.

---

[API](https://skmtc.dev/italic/apis/italic-api.md) - [All operations](https://skmtc.dev/italic/apis/italic-api/llms.txt) - [OpenAPI document](https://skmtc.dev/italic/apis/italic-api/revisions/2fbe2cf16fe3?raw)
