---
title: "Create flow node"
method: POST
path: "/public/v1/agents/{agentId}/flows/{flowId}/nodes"
tags: ["Flows"]
---

# Create flow node

`POST /public/v1/agents/{agentId}/flows/{flowId}/nodes`

Creates a node in a flow graph. The server assigns `nodeId` and `alias`; use the 201 response when adding edges or updates.

## Path parameters

- `agentId` string, required
- `flowId` number, nullable

## Request body

- PublicFlowNodeCreateInput
  - `node` object, required
    - `name` string
    - `position` object, required
      - `positionX` number, required
      - `positionY` number, required
    - `type` 'START' | 'TRIGGER_INTENT' | 'SAY_AI' | 'RESPONSE_AI' | 'TOOLS_AI' | 'API' | 'CONDITIONAL_ROUTING' | 'DYNAMIC_TABLES', required
    - `data` union
      - object
        - `type` 'TRIGGER_INTENT', required
        - `agenticRouting` string, nullable
        - `intentIds` number[], nullable
        - `intents` object[], nullable
          - `id` number, required
          - `name` string, required
          - `description` string, nullable
          - `createdAt` string, nullable, required
          - `updatedAt` string, nullable, required
          - `status` 'ACTIVE' | 'DELETED', required
          - `assistantId` string, required
          - `phrases` object[]
            - `id` number, required
            - `phrase` string, required
          - `flowId` number, nullable
      - object
        - `type` 'SAY_AI', required
        - `message` string, nullable
        - `temperature` number
        - `prompt` string, nullable
        - `aiModelId` number, nullable
        - `model` string, nullable
        - `aiVendor` 'OPENAI' | 'ANTHROPIC' | 'GOOGLE' | 'AZURE' | 'DEEPSEEK' | 'LLAMA', nullable
        - `sayWithAi` boolean, required
      - object
        - `type` 'RESPONSE_AI', required
        - `assistantId` string, uuid, required — Owning assistant UUID. Validated against the account on save.
        - `aiModelId` number, nullable
        - `model` string, required
        - `aiVendor` 'OPENAI' | 'ANTHROPIC' | 'GOOGLE' | 'AZURE' | 'DEEPSEEK' | 'LLAMA', required
        - `instructions` string, nullable, required
        - `temperature` number, required
        - `captureVariables` object[], required
        - `exitNodeWhen` 'ALL_VARIABLES' | 'FLOW_TRIGGERED' | 'ANY_VARIABLES', required
        - `knowledgeBaseMode` 'DEFAULT' | 'CUSTOM' | 'DISABLED'
        - `knowledgeBaseIds` integer[], nullable
      - object
        - `type` 'TOOLS_AI', required
        - `conditions` object[], required
          - `handleId` string, required
          - `expression` string, required
        - `temperature` number
        - `model` string
        - `aiVendor` 'OPENAI' | 'ANTHROPIC' | 'GOOGLE' | 'AZURE' | 'DEEPSEEK' | 'LLAMA'
        - `instructions` string, nullable, required
        - `prompt` string, nullable
        - `customToolIds` number[], nullable
        - `maxIterations` number
        - `agentType` 'BASIC' | 'ADVANCED'
        - `captureVariables` object[], nullable
        - `knowledgeBaseMode` 'DEFAULT' | 'CUSTOM' | 'DISABLED'
        - `knowledgeBaseIds` integer[], nullable
        - `selectedRecordTypes` object[], nullable
          - `recordTypeId` number, required
          - `read` boolean
          - `create` boolean
          - `update` boolean
          - `delete` boolean
          - `createActivity` boolean
        - `systemToolsConfig` object, nullable
          - `webSearchEnabled` boolean
          - `urlScrapeEnabled` boolean
          - `linkedinSearchEnabled` boolean
        - `connectedAccountConfigs` object[], nullable
          - `connectedAccountId` number, required
          - `useAllTools` boolean
          - `selectedToolSlugs` string[], nullable
        - `playbookIds` integer[], nullable
        - `aiModelId` integer, nullable
      - object
        - `type` 'API', required
        - `url` string, uri, required
        - `method` 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', required
        - `headers` object[], required
          - `key` string, required
          - `value` string, required
        - `body` string, nullable
        - `response` string, nullable
        - `parameters` object[], nullable
          - `key` string, required
          - `value` string, required
        - `variables` object[], nullable
          - `key` string, required
          - `value` string, required
          - `fullResponse` boolean
      - object
        - `type` 'CONDITIONAL_ROUTING', required
        - `routingType` 'CONDITIONAL_AI' | 'DYNAMIC', required
        - `conditions` object[], required
          - `handleId` string, required
          - `expression` string, required
        - `temperature` number
        - `model` string
        - `aiVendor` 'OPENAI' | 'ANTHROPIC' | 'GOOGLE' | 'AZURE' | 'DEEPSEEK' | 'LLAMA'
        - `aiModelId` integer, nullable
      - object
        - `type` 'DYNAMIC_TABLES', required
        - `tableId` number, nullable
        - `recordTypeId` number, nullable
        - `targetRecordTypeId` number, nullable — Destination record type id. Required when actionType is CHANGE_RECORD_TYPE.
        - `actionType` 'CREATE' | 'UPDATE' | 'DELETE' | 'SEARCH' | 'SEARCH_BY_ID' | 'CHANGE_RECORD_TYPE', nullable — Operation to run. Required-field rules per action: CREATE → rowData; UPDATE → rowId + rowData; DELETE / SEARCH_BY_ID → rowId; CHANGE_RECORD_TYPE → rowId + targetRecordTypeId.
        - `rowData` object, nullable
        - `inputModeByField` object, nullable
        - `rowId` string, nullable
        - `search` string, nullable
        - `pageNum` union
          - number
          - string
          - object, nullable
        - `pageSize` union
          - number
          - string
          - object, nullable
        - `pageNumMode` 'INPUT' | 'VARIABLE' | 'EMPTY', nullable
        - `pageSizeMode` 'INPUT' | 'VARIABLE' | 'EMPTY', nullable
        - `sort` object[], nullable
          - `path` string, required
          - `type` 'asc' | 'desc', required
        - `query` union
          - DynamicTablesQueryCondition
            - `path` string, required — Field path in format [Field] or [Relation].[Field]
            - `operator` string, required
            - `value` object, nullable
            - `valueType` object, nullable
          - DynamicTablesQueryGroup
            - `operator` 'and' | 'or', required
            - `conditions` object[], required — Nested filter conditions or AND/OR groups
              - …
          - object, nullable
      - object, nullable

## Response `201`

Created node

- PublicFlowNodeCreated
  - `nodeId` string, required
  - `alias` string, nullable, required
  - `name` string
  - `position` object, required
    - `positionX` number, required
    - `positionY` number, required
  - `type` 'START' | 'TRIGGER_INTENT' | 'SAY_AI' | 'RESPONSE_AI' | 'TOOLS_AI' | 'API' | 'CONDITIONAL_ROUTING' | 'DYNAMIC_TABLES', required
  - `data` union
    - object
      - `type` 'TRIGGER_INTENT', required
      - `agenticRouting` string, nullable
      - `intentIds` number[], nullable
      - `intents` object[], nullable
        - `id` number, required
        - `name` string, required
        - `description` string, nullable
        - `createdAt` string, nullable, required
        - `updatedAt` string, nullable, required
        - `status` 'ACTIVE' | 'DELETED', required
        - `assistantId` string, required
        - `phrases` object[]
          - `id` number, required
          - `phrase` string, required
        - `flowId` number, nullable
    - object
      - `type` 'SAY_AI', required
      - `message` string, nullable
      - `temperature` number
      - `prompt` string, nullable
      - `aiModelId` number, nullable
      - `model` string, nullable
      - `aiVendor` 'OPENAI' | 'ANTHROPIC' | 'GOOGLE' | 'AZURE' | 'DEEPSEEK' | 'LLAMA', nullable
      - `sayWithAi` boolean, required
    - object
      - `type` 'RESPONSE_AI', required
      - `assistantId` string, uuid, required — Owning assistant UUID. Validated against the account on save.
      - `aiModelId` number, nullable
      - `model` string, required
      - `aiVendor` 'OPENAI' | 'ANTHROPIC' | 'GOOGLE' | 'AZURE' | 'DEEPSEEK' | 'LLAMA', required
      - `instructions` string, nullable, required
      - `temperature` number, required
      - `captureVariables` object[], required
      - `exitNodeWhen` 'ALL_VARIABLES' | 'FLOW_TRIGGERED' | 'ANY_VARIABLES', required
      - `knowledgeBaseMode` 'DEFAULT' | 'CUSTOM' | 'DISABLED'
      - `knowledgeBaseIds` integer[], nullable
    - object
      - `type` 'TOOLS_AI', required
      - `conditions` object[], required
        - `handleId` string, required
        - `expression` string, required
      - `temperature` number
      - `model` string
      - `aiVendor` 'OPENAI' | 'ANTHROPIC' | 'GOOGLE' | 'AZURE' | 'DEEPSEEK' | 'LLAMA'
      - `instructions` string, nullable, required
      - `prompt` string, nullable
      - `customToolIds` number[], nullable
      - `maxIterations` number
      - `agentType` 'BASIC' | 'ADVANCED'
      - `captureVariables` object[], nullable
      - `knowledgeBaseMode` 'DEFAULT' | 'CUSTOM' | 'DISABLED'
      - `knowledgeBaseIds` integer[], nullable
      - `selectedRecordTypes` object[], nullable
        - `recordTypeId` number, required
        - `read` boolean
        - `create` boolean
        - `update` boolean
        - `delete` boolean
        - `createActivity` boolean
      - `systemToolsConfig` object, nullable
        - `webSearchEnabled` boolean
        - `urlScrapeEnabled` boolean
        - `linkedinSearchEnabled` boolean
      - `connectedAccountConfigs` object[], nullable
        - `connectedAccountId` number, required
        - `useAllTools` boolean
        - `selectedToolSlugs` string[], nullable
      - `playbookIds` integer[], nullable
      - `aiModelId` integer, nullable
    - object
      - `type` 'API', required
      - `url` string, uri, required
      - `method` 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH', required
      - `headers` object[], required
        - `key` string, required
        - `value` string, required
      - `body` string, nullable
      - `response` string, nullable
      - `parameters` object[], nullable
        - `key` string, required
        - `value` string, required
      - `variables` object[], nullable
        - `key` string, required
        - `value` string, required
        - `fullResponse` boolean
    - object
      - `type` 'CONDITIONAL_ROUTING', required
      - `routingType` 'CONDITIONAL_AI' | 'DYNAMIC', required
      - `conditions` object[], required
        - `handleId` string, required
        - `expression` string, required
      - `temperature` number
      - `model` string
      - `aiVendor` 'OPENAI' | 'ANTHROPIC' | 'GOOGLE' | 'AZURE' | 'DEEPSEEK' | 'LLAMA'
      - `aiModelId` integer, nullable
    - object
      - `type` 'DYNAMIC_TABLES', required
      - `tableId` number, nullable
      - `recordTypeId` number, nullable
      - `targetRecordTypeId` number, nullable — Destination record type id. Required when actionType is CHANGE_RECORD_TYPE.
      - `actionType` 'CREATE' | 'UPDATE' | 'DELETE' | 'SEARCH' | 'SEARCH_BY_ID' | 'CHANGE_RECORD_TYPE', nullable — Operation to run. Required-field rules per action: CREATE → rowData; UPDATE → rowId + rowData; DELETE / SEARCH_BY_ID → rowId; CHANGE_RECORD_TYPE → rowId + targetRecordTypeId.
      - `rowData` object, nullable
      - `inputModeByField` object, nullable
      - `rowId` string, nullable
      - `search` string, nullable
      - `pageNum` union
        - number
        - string
        - object, nullable
      - `pageSize` union
        - number
        - string
        - object, nullable
      - `pageNumMode` 'INPUT' | 'VARIABLE' | 'EMPTY', nullable
      - `pageSizeMode` 'INPUT' | 'VARIABLE' | 'EMPTY', nullable
      - `sort` object[], nullable
        - `path` string, required
        - `type` 'asc' | 'desc', required
      - `query` union
        - DynamicTablesQueryCondition
          - `path` string, required — Field path in format [Field] or [Relation].[Field]
          - `operator` string, required
          - `value` object, nullable
          - `valueType` object, nullable
        - DynamicTablesQueryGroup
          - `operator` 'and' | 'or', required
          - `conditions` object[], required — Nested filter conditions or AND/OR groups
        - object, nullable
    - object, nullable
  - `workflowId` string
  - `handles` object[]
    - `handleId` string, required
    - `sourceEdge` object, required
      - `from` string, required
      - `fromHandleId` string, required
      - `to` string, required
      - `toHandleId` string, required
    - `text` string, required
  - `targetEdges` object[]
    - `from` string, required
    - `fromHandleId` string, required
    - `to` string, required
    - `toHandleId` string, required
  - `createdAt` string, nullable
  - `updatedAt` string, nullable

## Other responses

- `409` — Conflict

---

[API](https://skmtc.net/getfrontline/apis/public-api.md) · [All operations](https://skmtc.net/getfrontline/apis/public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/getfrontline/public-api/revisions/9d33b6aad674/schema)
