Validate a workflow plan payload without creating anything. Strict validation (as if publishing). Returns isValid with warnings, or errors.
A workflow is a DAG of nodes described by the plan object: { name?, nodes: [] }.
Each node has a stable string id and a next array of node ids it points to (an empty string "" marks an unwired slot). There are three node kinds:
BLOCK — one workflow step. { id, kind: "BLOCK", blockId, inputs: {}, next: [] }. blockId comes from GET /v1/workflows/blocks; inputs are the block’s configurable inputs (discover them with GET /v1/workflows/blocks/{blockId}). A BLOCK has exactly one next slot, except two-outlet blocks: WAIT_FOR_APPROVAL has [approvedTargetId, rejectedTargetId] and CHECK_LEAD_FOR_CHANGES has [changedTargetId, unchangedTargetId].
Put configured values in a BLOCK’s inputs, never the input-catalog metadata. For a WEBHOOK trigger’s declared non-entity input, bind the matching field as { "webhookInputKey": "<declared key>" } (for example inputs.companyPayload = { "webhookInputKey": "companyPayload" }). Entity inputs such as leadIds and companyIds use "__MANUAL_INPUT" on the entry block instead.
CONDITIONAL — branches the stream. { id, kind: "CONDITIONAL", conditions: [], fallbackName?, next: [] }. Each condition is EITHER a field predicate { field, operator, value? } (lead/company/AI-variable fields — discover them with GET /v1/workflows/condition-fields) OR a random-split branch { type: "RANDOM_SPLIT", percentage } (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). next has exactly conditions.length + 1 entries: one target per matched condition (in order) then the fallback target LAST.
KING (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. { id, kind: "KING", groupBy, orderBy, checkAnyDomain?, limit?, next: [] }. next is [prioritizedTargetId, remainingTargetId].
Use importSources: [{ nodeId, previewId, maxCount }] to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from GET /v1/workflows/import-inputs; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow.
The first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (nodes: []) is valid for a brand-new draft.
Field/entity prefixes used inside conditions: company., anyLead., and webhookInput. for webhook-triggered workflows.
Resolve exact import source inputs from cached AI Finder previews before validation or saving. The referenced BLOCK must match the resolved blockId. Resolved source fields override copied values in node.inputs; other inputs are preserved. Preview references are not persisted.
Trigger configuration. Defaults to MANUAL when omitted during creation. SCHEDULE requires definition and startsAt. Recurrence byWeekday uses 0=Sunday, 1=Monday, through 6=Saturday; a Monday-only weekly schedule uses [1]. Always include Z or an explicit UTC offset in startsAt, with the requested wall-clock time in the selected IANA timezone; never send an offset-free timestamp. INTENT requires signal; WEBHOOK may declare inputs.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Enginy API Docs","description":"Developer docs for Enginy, the B2B prospecting platform: REST API, hosted MCP server, Advanced Workflows reference, and custom CRM integration.","colors":{"primary":"#1EC371","light":"#47E194","dark":"#171717"},"logo":{"light":"https://mintcdn.com/genesyai/WDIQAoU7a8DJAxu4/logo/enginy-dark.svg?fit=max\u0026auto=format\u0026n=WDIQAoU7a8DJAxu4\u0026q=85\u0026s=939acf98e42633af0faae66d57713e73","dark":"https://mintcdn.com/genesyai/WDIQAoU7a8DJAxu4/logo/enginy-light.svg?fit=max\u0026auto=format\u0026n=WDIQAoU7a8DJAxu4\u0026q=85\u0026s=e25861810973f70a5bcf4ff3e9e07b2a"},"favicon":"https://mintcdn.com/genesyai/WDIQAoU7a8DJAxu4/favicon.svg?fit=max\u0026auto=format\u0026n=WDIQAoU7a8DJAxu4\u0026q=85\u0026s=29e39121b8aed81a43a6f121813c4ee0","navbar":{"links":[{"href":"mailto:support@enginy.ai","label":"Support"}],"primary":{"type":"button","label":"App","href":"https://app.enginy.ai"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/enginy-ai"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Help Center","icon":"book-open-cover","href":"https://help.enginy.ai/"},{"anchor":"API Dashboard","icon":"key","href":"https://app.enginy.ai/api-access"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"genesyai","hasAudioNarration":false,"actualSubdomain":"genesyai","customDomains":["docs.enginy.ai"],"gitSource":{"type":"github","owner":"genesy-ai","repo":"leads-gpt","deployBranch":"main","contentDirectory":"openapi-docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6adb0409aa8f362a306d917d","collectionId":"1b918f07-3295-4564-8126-46ee4b0bb6ae","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6adb0409aa8f362a306d917d"},"entitlements":{},"buildId":"6adb096d35d195450e7200af","clientVersion":"0.0.3966","searchFilterCounts":[{"language":"default","tag":"API reference","count":226},{"language":"default","tag":"Endpoints","count":213},{"language":"default","tag":"AI Variables","count":46},{"language":"default","tag":"Workflows","count":39},{"language":"default","tag":"Custom CRM","count":24},{"language":"default","tag":"Contacts","count":21},{"language":"default","tag":"Lists","count":21},{"language":"default","tag":"Companies","count":20},{"language":"default","tag":"Campaigns","count":19},{"language":"default","tag":"Tasks","count":17}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"api-reference/workflows/validate-workflow","slug":"/api-reference/workflows/validate-workflow","pageMetadata":{"title":"Validate workflow","description":"Validate a workflow `plan` payload without creating anything. Strict validation (as if publishing). Returns `isValid` with warnings, or errors.\n\nA workflow is a DAG of nodes described by the `plan` object: `{ name?, nodes: [] }`.\nEach node has a stable string `id` and a `next` array of node ids it points to (an empty string `\"\"` marks an unwired slot). There are three node `kind`s:\n\n- `BLOCK` — one workflow step. `{ id, kind: \"BLOCK\", blockId, inputs: {}, next: [] }`. `blockId` comes from `GET /v1/workflows/blocks`; `inputs` are the block's configurable inputs (discover them with `GET /v1/workflows/blocks/{blockId}`). A BLOCK has exactly one `next` slot, except two-outlet blocks: `WAIT_FOR_APPROVAL` has `[approvedTargetId, rejectedTargetId]` and `CHECK_LEAD_FOR_CHANGES` has `[changedTargetId, unchangedTargetId]`.\nPut configured values in a BLOCK's `inputs`, never the input-catalog metadata. For a WEBHOOK trigger's declared non-entity input, bind the matching field as `{ \"webhookInputKey\": \"\u003cdeclared key>\" }` (for example `inputs.companyPayload = { \"webhookInputKey\": \"companyPayload\" }`). Entity inputs such as `leadIds` and `companyIds` use `\"__MANUAL_INPUT\"` on the entry block instead.\n- `CONDITIONAL` — branches the stream. `{ id, kind: \"CONDITIONAL\", conditions: [], fallbackName?, next: [] }`. Each condition is EITHER a field predicate `{ field, operator, value? }` (lead/company/AI-variable fields — discover them with `GET /v1/workflows/condition-fields`) OR a random-split branch `{ type: \"RANDOM_SPLIT\", percentage }` (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). `next` has exactly `conditions.length + 1` entries: one target per matched condition (in order) then the fallback target LAST.\n- `KING` (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. `{ id, kind: \"KING\", groupBy, orderBy, checkAnyDomain?, limit?, next: [] }`. `next` is `[prioritizedTargetId, remainingTargetId]`.\n\nUse `importSources: [{ nodeId, previewId, maxCount }]` to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from `GET /v1/workflows/import-inputs`; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow.\nThe first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (`nodes: []`) is valid for a brand-new draft.\nField/entity prefixes used inside conditions: `company.`, `anyLead.`, and `webhookInput.` for webhook-triggered workflows.\n\n > **Required scope:** `WORKFLOWS_WRITE`\n >\n > **Rate limit:** 30 requests per minute","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/workflows/validate","href":"/api-reference/workflows/validate-workflow","autogeneratedByOpenApi":true},"description":{"compiledSource":"\"use strict\";\nconst {Fragment: _Fragment, jsx: _jsx, jsxs: _jsxs} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n blockquote: \"blockquote\",\n code: \"code\",\n li: \"li\",\n p: \"p\",\n strong: \"strong\",\n ul: \"ul\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsxs(_Fragment, {\n children: [_jsxs(_components.p, {\n children: [\"Validate a workflow \", _jsx(_components.code, {\n children: \"plan\"\n }), \" payload without creating anything. Strict validation (as if publishing). Returns \", _jsx(_components.code, {\n children: \"isValid\"\n }), \" with warnings, or errors.\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"A workflow is a DAG of nodes described by the \", _jsx(_components.code, {\n children: \"plan\"\n }), \" object: \", _jsx(_components.code, {\n children: \"{ name?, nodes: [] }\"\n }), \".\\nEach node has a stable string \", _jsx(_components.code, {\n children: \"id\"\n }), \" and a \", _jsx(_components.code, {\n children: \"next\"\n }), \" array of node ids it points to (an empty string \", _jsx(_components.code, {\n children: \"\\\"\\\"\"\n }), \" marks an unwired slot). There are three node \", _jsx(_components.code, {\n children: \"kind\"\n }), \"s:\"]\n }), \"\\n\", _jsxs(_components.ul, {\n children: [\"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"BLOCK\"\n }), \" — one workflow step. \", _jsx(_components.code, {\n children: \"{ id, kind: \\\"BLOCK\\\", blockId, inputs: {}, next: [] }\"\n }), \". \", _jsx(_components.code, {\n children: \"blockId\"\n }), \" comes from \", _jsx(_components.code, {\n children: \"GET /v1/workflows/blocks\"\n }), \"; \", _jsx(_components.code, {\n children: \"inputs\"\n }), \" are the block’s configurable inputs (discover them with \", _jsx(_components.code, {\n children: \"GET /v1/workflows/blocks/{blockId}\"\n }), \"). A BLOCK has exactly one \", _jsx(_components.code, {\n children: \"next\"\n }), \" slot, except two-outlet blocks: \", _jsx(_components.code, {\n children: \"WAIT_FOR_APPROVAL\"\n }), \" has \", _jsx(_components.code, {\n children: \"[approvedTargetId, rejectedTargetId]\"\n }), \" and \", _jsx(_components.code, {\n children: \"CHECK_LEAD_FOR_CHANGES\"\n }), \" has \", _jsx(_components.code, {\n children: \"[changedTargetId, unchangedTargetId]\"\n }), \".\\nPut configured values in a BLOCK’s \", _jsx(_components.code, {\n children: \"inputs\"\n }), \", never the input-catalog metadata. For a WEBHOOK trigger’s declared non-entity input, bind the matching field as \", _jsx(_components.code, {\n children: \"{ \\\"webhookInputKey\\\": \\\"\u003cdeclared key>\\\" }\"\n }), \" (for example \", _jsx(_components.code, {\n children: \"inputs.companyPayload = { \\\"webhookInputKey\\\": \\\"companyPayload\\\" }\"\n }), \"). Entity inputs such as \", _jsx(_components.code, {\n children: \"leadIds\"\n }), \" and \", _jsx(_components.code, {\n children: \"companyIds\"\n }), \" use \", _jsx(_components.code, {\n children: \"\\\"__MANUAL_INPUT\\\"\"\n }), \" on the entry block instead.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"CONDITIONAL\"\n }), \" — branches the stream. \", _jsx(_components.code, {\n children: \"{ id, kind: \\\"CONDITIONAL\\\", conditions: [], fallbackName?, next: [] }\"\n }), \". Each condition is EITHER a field predicate \", _jsx(_components.code, {\n children: \"{ field, operator, value? }\"\n }), \" (lead/company/AI-variable fields — discover them with \", _jsx(_components.code, {\n children: \"GET /v1/workflows/condition-fields\"\n }), \") OR a random-split branch \", _jsx(_components.code, {\n children: \"{ type: \\\"RANDOM_SPLIT\\\", percentage }\"\n }), \" (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). \", _jsx(_components.code, {\n children: \"next\"\n }), \" has exactly \", _jsx(_components.code, {\n children: \"conditions.length + 1\"\n }), \" entries: one target per matched condition (in order) then the fallback target LAST.\"]\n }), \"\\n\", _jsxs(_components.li, {\n children: [_jsx(_components.code, {\n children: \"KING\"\n }), \" (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. \", _jsx(_components.code, {\n children: \"{ id, kind: \\\"KING\\\", groupBy, orderBy, checkAnyDomain?, limit?, next: [] }\"\n }), \". \", _jsx(_components.code, {\n children: \"next\"\n }), \" is \", _jsx(_components.code, {\n children: \"[prioritizedTargetId, remainingTargetId]\"\n }), \".\"]\n }), \"\\n\"]\n }), \"\\n\", _jsxs(_components.p, {\n children: [\"Use \", _jsx(_components.code, {\n children: \"importSources: [{ nodeId, previewId, maxCount }]\"\n }), \" to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from \", _jsx(_components.code, {\n children: \"GET /v1/workflows/import-inputs\"\n }), \"; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow.\\nThe first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (\", _jsx(_components.code, {\n children: \"nodes: []\"\n }), \") is valid for a brand-new draft.\\nField/entity prefixes used inside conditions: \", _jsx(_components.code, {\n children: \"company.\"\n }), \", \", _jsx(_components.code, {\n children: \"anyLead.\"\n }), \", and \", _jsx(_components.code, {\n children: \"webhookInput.\"\n }), \" for webhook-triggered workflows.\"]\n }), \"\\n\", _jsxs(_components.blockquote, {\n children: [\"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Required scope:\"\n }), \" \", _jsx(_components.code, {\n children: \"WORKFLOWS_WRITE\"\n })]\n }), \"\\n\", _jsxs(_components.p, {\n children: [_jsx(_components.strong, {\n children: \"Rate limit:\"\n }), \" 30 requests per minute\"]\n }), \"\\n\"]\n })]\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){return _jsx(_Fragment,{})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Validate workflow","description":"Validate a workflow `plan` payload without creating anything. Strict validation (as if publishing). Returns `isValid` with warnings, or errors.\n\nA workflow is a DAG of nodes described by the `plan` object: `{ name?, nodes: [] }`.\nEach node has a stable string `id` and a `next` array of node ids it points to (an empty string `\"\"` marks an unwired slot). There are three node `kind`s:\n\n- `BLOCK` — one workflow step. `{ id, kind: \"BLOCK\", blockId, inputs: {}, next: [] }`. `blockId` comes from `GET /v1/workflows/blocks`; `inputs` are the block's configurable inputs (discover them with `GET /v1/workflows/blocks/{blockId}`). A BLOCK has exactly one `next` slot, except two-outlet blocks: `WAIT_FOR_APPROVAL` has `[approvedTargetId, rejectedTargetId]` and `CHECK_LEAD_FOR_CHANGES` has `[changedTargetId, unchangedTargetId]`.\nPut configured values in a BLOCK's `inputs`, never the input-catalog metadata. For a WEBHOOK trigger's declared non-entity input, bind the matching field as `{ \"webhookInputKey\": \"\u003cdeclared key>\" }` (for example `inputs.companyPayload = { \"webhookInputKey\": \"companyPayload\" }`). Entity inputs such as `leadIds` and `companyIds` use `\"__MANUAL_INPUT\"` on the entry block instead.\n- `CONDITIONAL` — branches the stream. `{ id, kind: \"CONDITIONAL\", conditions: [], fallbackName?, next: [] }`. Each condition is EITHER a field predicate `{ field, operator, value? }` (lead/company/AI-variable fields — discover them with `GET /v1/workflows/condition-fields`) OR a random-split branch `{ type: \"RANDOM_SPLIT\", percentage }` (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). `next` has exactly `conditions.length + 1` entries: one target per matched condition (in order) then the fallback target LAST.\n- `KING` (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. `{ id, kind: \"KING\", groupBy, orderBy, checkAnyDomain?, limit?, next: [] }`. `next` is `[prioritizedTargetId, remainingTargetId]`.\n\nUse `importSources: [{ nodeId, previewId, maxCount }]` to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from `GET /v1/workflows/import-inputs`; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow.\nThe first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (`nodes: []`) is valid for a brand-new draft.\nField/entity prefixes used inside conditions: `company.`, `anyLead.`, and `webhookInput.` for webhook-triggered workflows.\n\n > **Required scope:** `WORKFLOWS_WRITE`\n >\n > **Rate limit:** 30 requests per minute","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/workflows/validate","href":"/api-reference/workflows/validate-workflow","autogeneratedByOpenApi":true}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"openApiReferenceData":{"operation":{"summary":"Validate workflow","description":"Validate a workflow `plan` payload without creating anything. Strict validation (as if publishing). Returns `isValid` with warnings, or errors.\n\nA workflow is a DAG of nodes described by the `plan` object: `{ name?, nodes: [] }`.\nEach node has a stable string `id` and a `next` array of node ids it points to (an empty string `\"\"` marks an unwired slot). There are three node `kind`s:\n\n- `BLOCK` — one workflow step. `{ id, kind: \"BLOCK\", blockId, inputs: {}, next: [] }`. `blockId` comes from `GET /v1/workflows/blocks`; `inputs` are the block's configurable inputs (discover them with `GET /v1/workflows/blocks/{blockId}`). A BLOCK has exactly one `next` slot, except two-outlet blocks: `WAIT_FOR_APPROVAL` has `[approvedTargetId, rejectedTargetId]` and `CHECK_LEAD_FOR_CHANGES` has `[changedTargetId, unchangedTargetId]`.\nPut configured values in a BLOCK's `inputs`, never the input-catalog metadata. For a WEBHOOK trigger's declared non-entity input, bind the matching field as `{ \"webhookInputKey\": \"\u003cdeclared key>\" }` (for example `inputs.companyPayload = { \"webhookInputKey\": \"companyPayload\" }`). Entity inputs such as `leadIds` and `companyIds` use `\"__MANUAL_INPUT\"` on the entry block instead.\n- `CONDITIONAL` — branches the stream. `{ id, kind: \"CONDITIONAL\", conditions: [], fallbackName?, next: [] }`. Each condition is EITHER a field predicate `{ field, operator, value? }` (lead/company/AI-variable fields — discover them with `GET /v1/workflows/condition-fields`) OR a random-split branch `{ type: \"RANDOM_SPLIT\", percentage }` (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). `next` has exactly `conditions.length + 1` entries: one target per matched condition (in order) then the fallback target LAST.\n- `KING` (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. `{ id, kind: \"KING\", groupBy, orderBy, checkAnyDomain?, limit?, next: [] }`. `next` is `[prioritizedTargetId, remainingTargetId]`.\n\nUse `importSources: [{ nodeId, previewId, maxCount }]` to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from `GET /v1/workflows/import-inputs`; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow.\nThe first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (`nodes: []`) is valid for a brand-new draft.\nField/entity prefixes used inside conditions: `company.`, `anyLead.`, and `webhookInput.` for webhook-triggered workflows.\n\n > **Required scope:** `WORKFLOWS_WRITE`\n >\n > **Rate limit:** 30 requests per minute","x-enginy-mcp-description":"Validates a workflow plan payload (strict) without creating it. Call before create_workflow with publish:true. Workflows are a DAG in `plan.nodes`. Each node has an `id` and a `next` array of ids (`\"\"` = unwired). Node kinds: BLOCK (one step; `blockId` + `inputs`; one next slot, two for WAIT_FOR_APPROVAL `[approved, rejected]` and CHECK_LEAD_FOR_CHANGES `[changed, unchanged]`), CONDITIONAL (`conditions` + `next` = one target per condition then the fallback last; a condition is `{ field, operator, value? }` or a random A/B split `{ \"type\": \"RANDOM_SPLIT\", \"percentage\": 1-100 }` with sibling percentages summing to ≤ 100), KING (shown as Prioritize by group; `groupBy`/`orderBy`/`limit`; next = [prioritized, remaining]). Start with a selector/import block. Max 60 nodes, no cycles. Call get_workflow_blocks + get_workflow_block_inputs to discover valid blockIds/inputs and get_workflow_condition_fields for CONDITIONAL fields. For import sources, resolve audience filters with preview_an_ai_finder_search, then get_workflow_import_inputs to obtain blockId and its short source reference. Use the blockId with empty inputs and pass { nodeId, ...source } in importSources to validate/create/update; the server fills exact source values. Do not copy encoded URLs. LinkedIn search URLs are generated, not required from the user. Put configured values, never catalog metadata, in BLOCK inputs. Bind a declared non-entity WEBHOOK input as `{ \"webhookInputKey\": \"\u003cdeclared key>\" }` in the matching field; entity inputs use `\"__MANUAL_INPUT\"`.","tags":["Workflows"],"security":["d9ec1ee2-6487-4789-abd2-a3c70837fac6"],"requestBody":"d83aac77-1944-4425-9595-ed9618d5f2f3","responses":{"200":"fbbb46de-3461-4689-b2fe-5dc5047eec12","400":"87ec8415-b4bd-4ec9-9b31-d221d93af68e","403":"cf1ad34c-9cec-4fcb-953c-24cc95f46b6f","404":"d85764da-de2c-41f2-a810-d82748651498","422":"cc16f857-b215-49a2-a25f-b0adb8138fe8"},"method":"post","type":"path","servers":["0583bc01-7d89-47ba-9860-852cd05faae2"],"path":"/v1/workflows/validate","baseUrlOptions":["https://openapi.enginy.ai"],"title":"Validate workflow","codeSamples":[],"requiredOnlyExamples":false,"requestExampleType":"generated","responseExampleType":"generated"},"dependencies":{"parameters":{},"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120,"description":"Workflow name.","isRequired":true,"uniqueKey":"name","typeLabel":"string"},"plan":{"type":"object","properties":{"nodes":{"type":"array","items":{"oneOf":[{"type":"object","title":"BLOCK","required":["id","kind","blockId","inputs","next"],"properties":{"id":{"type":"string","minLength":1,"maxLength":128,"description":"Stable node id (any non-empty string).","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.0.id","typeLabel":"string"},"kind":{"type":"string","enum":["BLOCK"],"isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.0.kind","typeLabel":"enum\u003cstring>"},"blockId":{"type":"string","minLength":1,"description":"Block id from `GET /v1/workflows/blocks`.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.0.blockId","typeLabel":"string"},"inputs":{"type":"object","additionalProperties":{"oneOf":[{}],"uniqueKey":"plan.nodes.items.[INDEX].oneOf.0.inputs.additionalProperties","typeLabel":"any"},"description":"Configured inputs for the block.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.0.inputs","typeLabel":"object"},"next":{"type":"array","items":{"type":"string","uniqueKey":"plan.nodes.items.[INDEX].oneOf.0.next.items.[INDEX]","typeLabel":"string"},"maxItems":2,"description":"Outgoing node ids. One slot, or two for two-outlet blocks: `[approved, rejected]` for WAIT_FOR_APPROVAL, `[changed, unchanged]` for CHECK_LEAD_FOR_CHANGES. `\"\"` = unwired.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.0.next","typeLabel":"string[]"}},"additionalProperties":false,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.0","typeLabel":"BLOCK · object"},{"type":"object","title":"CONDITIONAL","required":["id","kind","conditions","next"],"properties":{"id":{"type":"string","minLength":1,"maxLength":128,"isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.id","typeLabel":"string"},"kind":{"type":"string","enum":["CONDITIONAL"],"isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.kind","typeLabel":"enum\u003cstring>"},"conditions":{"type":"array","items":{"oneOf":[{"type":"object","title":"FieldCondition","required":["field","operator"],"properties":{"field":{"type":"string","description":"Condition field id/name. See `GET /v1/workflows/condition-fields`.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.field","typeLabel":"string"},"operator":{"type":"string","description":"Condition operator id. See `GET /v1/workflows/condition-fields`.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.operator","typeLabel":"string"},"name":{"type":"string","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.name","typeLabel":"string"},"value":{"oneOf":[{"type":"string","description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.0","typeLabel":"string"},{"type":"number","description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.1","typeLabel":"number"},{"type":"boolean","description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.2","typeLabel":"boolean"},{"type":"array","items":{"type":"string","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.3.items.[INDEX]","typeLabel":"string"},"description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.3","typeLabel":"string[]"},{"type":"array","items":{"type":"number","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.4.items.[INDEX]","typeLabel":"number"},"description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.4","typeLabel":"number[]"}],"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value","typeLabel":"string | number | boolean | string[] | number[]"}},"additionalProperties":false,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0","typeLabel":"FieldCondition · object"},{"type":"object","title":"RandomSplitCondition","required":["type","percentage"],"properties":{"type":{"type":"string","enum":["RANDOM_SPLIT"],"isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"percentage":{"type":"integer","minimum":1,"maximum":100,"description":"Share of entities (integer 1-100) deterministically routed to this branch. Sibling split percentages must sum to ≤ 100; the remainder falls through to the fallback branch.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.1.percentage","typeLabel":"integer"},"name":{"type":"string","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.1.name","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.1","typeLabel":"RandomSplitCondition · object"}],"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX]","typeLabel":"FieldCondition · object | RandomSplitCondition · object"},"minItems":1,"maxItems":20,"isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.conditions","typeLabel":"(FieldCondition · object | RandomSplitCondition · object)[]"},"next":{"type":"array","items":{"type":"string","uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.next.items.[INDEX]","typeLabel":"string"},"description":"One target per condition (in order) then the fallback LAST. Length = conditions.length + 1.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.next","typeLabel":"string[]"},"fallbackName":{"type":"string","maxLength":120,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1.fallbackName","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.1","typeLabel":"CONDITIONAL · object"},{"type":"object","title":"KING","required":["id","kind","groupBy","orderBy","next"],"properties":{"id":{"type":"string","minLength":1,"maxLength":128,"isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.id","typeLabel":"string"},"kind":{"type":"string","enum":["KING"],"isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.kind","typeLabel":"enum\u003cstring>"},"groupBy":{"type":"string","minLength":1,"description":"Field used to group records.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.groupBy","typeLabel":"string"},"orderBy":{"type":"number","description":"Formula field id used to sort every group ascending.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.orderBy","typeLabel":"number"},"next":{"type":"array","items":{"type":"string","uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.next.items.[INDEX]","typeLabel":"string"},"maxItems":2,"description":"`[prioritizedTargetId, remainingTargetId]`.","isRequired":true,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.next","typeLabel":"string[]"},"checkAnyDomain":{"type":"boolean","description":"For domain/website groups, match domain names regardless of suffix.","uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.checkAnyDomain","typeLabel":"boolean"},"limit":{"oneOf":[{"type":"number","description":"Exact number of records to prioritize from each group.","uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.limit.oneOf.0","typeLabel":"number"},{"type":"null","description":"Exact number of records to prioritize from each group.","uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.limit.oneOf.1","typeLabel":"null"}],"uniqueKey":"plan.nodes.items.[INDEX].oneOf.2.limit","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"plan.nodes.items.[INDEX].oneOf.2","typeLabel":"KING · object"}],"uniqueKey":"plan.nodes.items.[INDEX]","typeLabel":"BLOCK · object | CONDITIONAL · object | KING · object"},"maxItems":60,"description":"At most 60 nodes; no cycles.","isRequired":true,"uniqueKey":"plan.nodes","typeLabel":"(BLOCK · object | CONDITIONAL · object | KING · object)[]"},"name":{"type":"string","minLength":1,"maxLength":120,"uniqueKey":"plan.name","typeLabel":"string"}},"required":["nodes"],"additionalProperties":false,"title":"WorkflowPlan","description":"The workflow DAG. See the endpoint description for the plan format.","isRequired":true,"uniqueKey":"plan","typeLabel":"WorkflowPlan · object"},"importSources":{"type":"array","items":{"type":"object","properties":{"previewId":{"type":"string","minLength":1,"maxLength":200,"description":"Latest AI Finder previewId for the source audience.","isRequired":true,"uniqueKey":"importSources.items.[INDEX].previewId","typeLabel":"string"},"maxCount":{"type":"integer","exclusiveMinimum":0,"maximum":10000,"description":"Maximum records to import per workflow run.","isRequired":true,"uniqueKey":"importSources.items.[INDEX].maxCount","typeLabel":"integer"},"nodeId":{"type":"string","minLength":1,"maxLength":128,"description":"Existing BLOCK node id whose source inputs to resolve.","isRequired":true,"uniqueKey":"importSources.items.[INDEX].nodeId","typeLabel":"string"}},"required":["previewId","maxCount","nodeId"],"additionalProperties":false,"uniqueKey":"importSources.items.[INDEX]","typeLabel":"object"},"minItems":1,"maxItems":60,"description":"Resolve exact import source inputs from cached AI Finder previews before validation or saving. The referenced BLOCK must match the resolved blockId. Resolved source fields override copied values in node.inputs; other inputs are preserved. Preview references are not persisted.","uniqueKey":"importSources","typeLabel":"object[]"},"trigger":{"oneOf":[{"type":"object","title":"WorkflowTrigger","description":"Trigger configuration. Defaults to MANUAL when omitted during creation. SCHEDULE requires `definition` and `startsAt`. Recurrence `byWeekday` uses 0=Sunday, 1=Monday, through 6=Saturday; a Monday-only weekly schedule uses [1]. Always include Z or an explicit UTC offset in startsAt, with the requested wall-clock time in the selected IANA timezone; never send an offset-free timestamp. INTENT requires `signal`; WEBHOOK may declare `inputs`.","required":["type"],"properties":{"type":{"type":"string","enum":["MANUAL"],"isRequired":true,"uniqueKey":"trigger.oneOf.0.type","typeLabel":"enum\u003cstring>"},"entity":{"type":"string","enum":["LEAD","COMPANY"],"uniqueKey":"trigger.oneOf.0.entity","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.0","typeLabel":"WorkflowTrigger · object"},{"type":"object","title":"WorkflowTrigger","description":"Trigger configuration. Defaults to MANUAL when omitted during creation. SCHEDULE requires `definition` and `startsAt`. Recurrence `byWeekday` uses 0=Sunday, 1=Monday, through 6=Saturday; a Monday-only weekly schedule uses [1]. Always include Z or an explicit UTC offset in startsAt, with the requested wall-clock time in the selected IANA timezone; never send an offset-free timestamp. INTENT requires `signal`; WEBHOOK may declare `inputs`.","required":["type"],"properties":{"type":{"type":"string","enum":["WEBHOOK"],"isRequired":true,"uniqueKey":"trigger.oneOf.1.type","typeLabel":"enum\u003cstring>"},"inputs":{"type":"array","items":{"type":"object","properties":{"key":{"type":"string","minLength":1,"maxLength":64,"isRequired":true,"uniqueKey":"trigger.oneOf.1.inputs.items.[INDEX].key","typeLabel":"string"},"type":{"type":"string","enum":["leadIds","companyIds","messageTemplate","urlTemplate","exportAssociatedObject","taskType","title","description","leadsSearchUrl","companiesSearchUrl","maxCount","leadProperties","skipCompanyScrape","enrichFromLinkedIn","maxTimeToWait","fullResync","stopType","selectedAiFields","selectedFunctionFields","postUrl","eventUrl","jobsUrl","pollUrl","maxLeadsToImport","postImportType","query","maxCompaniesToImport","maxJobPostings","importCompaniesPermanentlyClosed","importCompaniesWithNoDomain","matchOnlySimilarName","matchOnlyExactName","matchOnlyExactDomain","keyword","onlyIncludeIfCompanyUrnMatch","excludeContactedLeads","campaignId","celebrationMessage","importOnlyNewContacts","selectedContactUrns","activity","hubspotCompanyListId","salesforceCompanyListId","dynamicsCompanyListId","zohoCompanyListId","hubspotLeadListId","salesforceLeadListId","salesforceLeadReportId","dynamicsLeadListId","zohoLeadListId","storeLeadsSelectedDomains","websiteVisitorConfigId","maxContactsToImport","maxInvestorsToImport","emptyFieldId","createNewList","newListName","profileUrl","contactPayload","companyPayload","dateRange","agentPrompt","selectedMcpTools","waitMode","waitDuration","waitDateField","httpMethod","httpUrl","httpBody","slackChannelId","slackMessageTemplate","slackMentionUserIds"],"isRequired":true,"uniqueKey":"trigger.oneOf.1.inputs.items.[INDEX].type","typeLabel":"enum\u003cstring>"},"label":{"type":"string","minLength":1,"maxLength":120,"uniqueKey":"trigger.oneOf.1.inputs.items.[INDEX].label","typeLabel":"string"}},"required":["key","type"],"additionalProperties":false,"uniqueKey":"trigger.oneOf.1.inputs.items.[INDEX]","typeLabel":"object"},"maxItems":20,"uniqueKey":"trigger.oneOf.1.inputs","typeLabel":"object[]"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.1","typeLabel":"WorkflowTrigger · object"},{"type":"object","title":"WorkflowTrigger","description":"Trigger configuration. Defaults to MANUAL when omitted during creation. SCHEDULE requires `definition` and `startsAt`. Recurrence `byWeekday` uses 0=Sunday, 1=Monday, through 6=Saturday; a Monday-only weekly schedule uses [1]. Always include Z or an explicit UTC offset in startsAt, with the requested wall-clock time in the selected IANA timezone; never send an offset-free timestamp. INTENT requires `signal`; WEBHOOK may declare `inputs`.","required":["type","signal"],"properties":{"type":{"type":"string","enum":["INTENT"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.type","typeLabel":"enum\u003cstring>"},"signal":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["CONVERSATION_REPLY"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"tagIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.0.tagIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.0.tagIds","typeLabel":"integer[]"},"identityIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.0.identityIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.0.identityIds","typeLabel":"integer[]"},"campaignIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.0.campaignIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.0.campaignIds","typeLabel":"integer[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.0","typeLabel":"object"},{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["EMAIL_OPENED"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"campaignIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.1.campaignIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.1.campaignIds","typeLabel":"integer[]"},"identityIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.1.identityIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.1.identityIds","typeLabel":"integer[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.1","typeLabel":"object"},{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["EMAIL_LINK_CLICKED"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.2.kind","typeLabel":"enum\u003cstring>"},"campaignIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.2.campaignIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.2.campaignIds","typeLabel":"integer[]"},"identityIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.2.identityIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.2.identityIds","typeLabel":"integer[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.2","typeLabel":"object"},{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["LINKEDIN_MESSAGE_VIEWED"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.3.kind","typeLabel":"enum\u003cstring>"},"campaignIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.3.campaignIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.3.campaignIds","typeLabel":"integer[]"},"identityIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.3.identityIds.items.[INDEX]","typeLabel":"integer"},"uniqueKey":"trigger.oneOf.2.signal.oneOf.3.identityIds","typeLabel":"integer[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.3","typeLabel":"object"},{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["WEBSITE_VISITOR"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.4.kind","typeLabel":"enum\u003cstring>"},"minConfidence":{"type":"string","enum":["LOW","MEDIUM","HIGH","VERY_HIGH"],"uniqueKey":"trigger.oneOf.2.signal.oneOf.4.minConfidence","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.4","typeLabel":"object"},{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["LEAD_CREATED"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.5.kind","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.5","typeLabel":"object"},{"type":"object","required":["kind"],"properties":{"kind":{"type":"string","enum":["COMPANY_CREATED"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.6.kind","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.6","typeLabel":"object"},{"type":"object","required":["kind","fields"],"properties":{"kind":{"type":"string","enum":["LEAD_PROPERTY_UPDATED"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.7.kind","typeLabel":"enum\u003cstring>"},"fields":{"type":"array","items":{"type":"string","minLength":1,"uniqueKey":"trigger.oneOf.2.signal.oneOf.7.fields.items.[INDEX]","typeLabel":"string"},"minItems":1,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.7.fields","typeLabel":"string[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.7","typeLabel":"object"},{"type":"object","required":["kind","fields"],"properties":{"kind":{"type":"string","enum":["COMPANY_PROPERTY_UPDATED"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.8.kind","typeLabel":"enum\u003cstring>"},"fields":{"type":"array","items":{"type":"string","minLength":1,"uniqueKey":"trigger.oneOf.2.signal.oneOf.8.fields.items.[INDEX]","typeLabel":"string"},"minItems":1,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.8.fields","typeLabel":"string[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.8","typeLabel":"object"},{"type":"object","required":["kind","listIds"],"properties":{"kind":{"type":"string","enum":["LEAD_ADDED_TO_LIST"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.9.kind","typeLabel":"enum\u003cstring>"},"listIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.9.listIds.items.[INDEX]","typeLabel":"integer"},"minItems":1,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.9.listIds","typeLabel":"integer[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.9","typeLabel":"object"},{"type":"object","required":["kind","listIds"],"properties":{"kind":{"type":"string","enum":["COMPANY_ADDED_TO_LIST"],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.10.kind","typeLabel":"enum\u003cstring>"},"listIds":{"type":"array","items":{"type":"integer","exclusiveMinimum":0,"uniqueKey":"trigger.oneOf.2.signal.oneOf.10.listIds.items.[INDEX]","typeLabel":"integer"},"minItems":1,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.10.listIds","typeLabel":"integer[]"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal.oneOf.10","typeLabel":"object"}],"isRequired":true,"uniqueKey":"trigger.oneOf.2.signal","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.2","typeLabel":"WorkflowTrigger · object"},{"type":"object","title":"WorkflowTrigger","description":"Trigger configuration. Defaults to MANUAL when omitted during creation. SCHEDULE requires `definition` and `startsAt`. Recurrence `byWeekday` uses 0=Sunday, 1=Monday, through 6=Saturday; a Monday-only weekly schedule uses [1]. Always include Z or an explicit UTC offset in startsAt, with the requested wall-clock time in the selected IANA timezone; never send an offset-free timestamp. INTENT requires `signal`; WEBHOOK may declare `inputs`.","required":["type","definition","startsAt"],"properties":{"type":{"type":"string","enum":["SCHEDULE"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.type","typeLabel":"enum\u003cstring>"},"definition":{"type":"string","enum":["DAILY","WEEKLY","BI_WEEKLY","MONTHLY","QUARTERLY","YEARLY"],"description":"Required legacy cadence key, not free text: DAILY, WEEKLY, BI_WEEKLY, MONTHLY, QUARTERLY, or YEARLY. Use BI_WEEKLY for every 2 weeks. Still pass one of these exact keys when recurrence is present; the server derives the final key from that rule.","isRequired":true,"uniqueKey":"trigger.oneOf.3.definition","typeLabel":"enum\u003cstring>"},"startsAt":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.startsAt","typeLabel":"string"},"recurrence":{"oneOf":[{"type":"object","required":["interval","frequency"],"properties":{"interval":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.interval","typeLabel":"integer"},"frequency":{"type":"string","enum":["DAILY"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.frequency","typeLabel":"enum\u003cstring>"},"version":{"type":"number","enum":[1],"default":1,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.version","typeLabel":"enum\u003cnumber>"},"end":{"oneOf":[{"type":"object","default":{"kind":"NEVER"},"required":["kind"],"properties":{"kind":{"type":"string","enum":["NEVER"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end.oneOf.0.kind","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end.oneOf.0","typeLabel":"object"},{"type":"object","default":{"kind":"NEVER"},"required":["kind","until"],"properties":{"kind":{"type":"string","enum":["ON_DATE"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"until":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end.oneOf.1.until","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end.oneOf.1","typeLabel":"object"},{"type":"object","default":{"kind":"NEVER"},"required":["kind","count"],"properties":{"kind":{"type":"string","enum":["AFTER_OCCURRENCES"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end.oneOf.2.kind","typeLabel":"enum\u003cstring>"},"count":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end.oneOf.2.count","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end.oneOf.2","typeLabel":"object"}],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0.end","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.0","typeLabel":"object"},{"type":"object","required":["interval","frequency","byWeekday"],"properties":{"interval":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.interval","typeLabel":"integer"},"frequency":{"type":"string","enum":["WEEKLY"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.frequency","typeLabel":"enum\u003cstring>"},"byWeekday":{"type":"array","items":{"oneOf":[{"type":"number","enum":[0],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday.items.[INDEX].oneOf.0","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[1],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday.items.[INDEX].oneOf.1","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[2],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday.items.[INDEX].oneOf.2","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[3],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday.items.[INDEX].oneOf.3","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[4],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday.items.[INDEX].oneOf.4","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[5],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday.items.[INDEX].oneOf.5","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[6],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday.items.[INDEX].oneOf.6","typeLabel":"enum\u003cnumber>"}],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday.items.[INDEX]","typeLabel":"enum\u003cnumber>"},"minItems":1,"maxItems":7,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.byWeekday","typeLabel":"enum\u003cnumber>[]"},"version":{"type":"number","enum":[1],"default":1,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.version","typeLabel":"enum\u003cnumber>"},"end":{"oneOf":[{"type":"object","default":{"kind":"NEVER"},"required":["kind"],"properties":{"kind":{"type":"string","enum":["NEVER"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end.oneOf.0.kind","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end.oneOf.0","typeLabel":"object"},{"type":"object","default":{"kind":"NEVER"},"required":["kind","until"],"properties":{"kind":{"type":"string","enum":["ON_DATE"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"until":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end.oneOf.1.until","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end.oneOf.1","typeLabel":"object"},{"type":"object","default":{"kind":"NEVER"},"required":["kind","count"],"properties":{"kind":{"type":"string","enum":["AFTER_OCCURRENCES"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end.oneOf.2.kind","typeLabel":"enum\u003cstring>"},"count":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end.oneOf.2.count","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end.oneOf.2","typeLabel":"object"}],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1.end","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.1","typeLabel":"object"},{"type":"object","required":["interval","frequency","monthly"],"properties":{"interval":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.interval","typeLabel":"integer"},"frequency":{"type":"string","enum":["MONTHLY"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.frequency","typeLabel":"enum\u003cstring>"},"monthly":{"oneOf":[{"type":"object","required":["kind","day"],"properties":{"kind":{"type":"string","enum":["DAY_OF_MONTH"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.0.kind","typeLabel":"enum\u003cstring>"},"day":{"type":"integer","minimum":1,"maximum":31,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.0.day","typeLabel":"integer"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.0","typeLabel":"object"},{"type":"object","required":["kind","weekday","ordinal"],"properties":{"kind":{"type":"string","enum":["NTH_WEEKDAY"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"weekday":{"oneOf":[{"type":"number","enum":[0],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.weekday.oneOf.0","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[1],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.weekday.oneOf.1","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[2],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.weekday.oneOf.2","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[3],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.weekday.oneOf.3","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[4],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.weekday.oneOf.4","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[5],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.weekday.oneOf.5","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[6],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.weekday.oneOf.6","typeLabel":"enum\u003cnumber>"}],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.weekday","typeLabel":"enum\u003cnumber>"},"ordinal":{"oneOf":[{"type":"number","enum":[1],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.ordinal.oneOf.0","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[2],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.ordinal.oneOf.1","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[3],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.ordinal.oneOf.2","typeLabel":"enum\u003cnumber>"},{"type":"number","enum":[4],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.ordinal.oneOf.3","typeLabel":"enum\u003cnumber>"}],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1.ordinal","typeLabel":"enum\u003cnumber>"}},"additionalProperties":false,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly.oneOf.1","typeLabel":"object"}],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.monthly","typeLabel":"object"},"version":{"type":"number","enum":[1],"default":1,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.version","typeLabel":"enum\u003cnumber>"},"end":{"oneOf":[{"type":"object","default":{"kind":"NEVER"},"required":["kind"],"properties":{"kind":{"type":"string","enum":["NEVER"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end.oneOf.0.kind","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end.oneOf.0","typeLabel":"object"},{"type":"object","default":{"kind":"NEVER"},"required":["kind","until"],"properties":{"kind":{"type":"string","enum":["ON_DATE"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"until":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end.oneOf.1.until","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end.oneOf.1","typeLabel":"object"},{"type":"object","default":{"kind":"NEVER"},"required":["kind","count"],"properties":{"kind":{"type":"string","enum":["AFTER_OCCURRENCES"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end.oneOf.2.kind","typeLabel":"enum\u003cstring>"},"count":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end.oneOf.2.count","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end.oneOf.2","typeLabel":"object"}],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2.end","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.2","typeLabel":"object"},{"type":"object","required":["interval","frequency"],"properties":{"interval":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.interval","typeLabel":"integer"},"frequency":{"type":"string","enum":["YEARLY"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.frequency","typeLabel":"enum\u003cstring>"},"version":{"type":"number","enum":[1],"default":1,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.version","typeLabel":"enum\u003cnumber>"},"end":{"oneOf":[{"type":"object","default":{"kind":"NEVER"},"required":["kind"],"properties":{"kind":{"type":"string","enum":["NEVER"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end.oneOf.0.kind","typeLabel":"enum\u003cstring>"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end.oneOf.0","typeLabel":"object"},{"type":"object","default":{"kind":"NEVER"},"required":["kind","until"],"properties":{"kind":{"type":"string","enum":["ON_DATE"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end.oneOf.1.kind","typeLabel":"enum\u003cstring>"},"until":{"type":"string","minLength":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end.oneOf.1.until","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end.oneOf.1","typeLabel":"object"},{"type":"object","default":{"kind":"NEVER"},"required":["kind","count"],"properties":{"kind":{"type":"string","enum":["AFTER_OCCURRENCES"],"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end.oneOf.2.kind","typeLabel":"enum\u003cstring>"},"count":{"type":"integer","minimum":1,"isRequired":true,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end.oneOf.2.count","typeLabel":"integer"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end.oneOf.2","typeLabel":"object"}],"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3.end","typeLabel":"object"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3.recurrence.oneOf.3","typeLabel":"object"}],"uniqueKey":"trigger.oneOf.3.recurrence","typeLabel":"object"},"timezone":{"oneOf":[{"type":"string","uniqueKey":"trigger.oneOf.3.timezone.oneOf.0","typeLabel":"string"},{"type":"null","uniqueKey":"trigger.oneOf.3.timezone.oneOf.1","typeLabel":"null"}],"uniqueKey":"trigger.oneOf.3.timezone","typeLabel":"string | null"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.3","typeLabel":"WorkflowTrigger · object"},{"type":"object","title":"WorkflowTrigger","description":"Trigger configuration. Defaults to MANUAL when omitted during creation. SCHEDULE requires `definition` and `startsAt`. Recurrence `byWeekday` uses 0=Sunday, 1=Monday, through 6=Saturday; a Monday-only weekly schedule uses [1]. Always include Z or an explicit UTC offset in startsAt, with the requested wall-clock time in the selected IANA timezone; never send an offset-free timestamp. INTENT requires `signal`; WEBHOOK may declare `inputs`.","required":["type"],"properties":{"type":{"type":"string","enum":["API"],"isRequired":true,"uniqueKey":"trigger.oneOf.4.type","typeLabel":"enum\u003cstring>"},"inputSchema":{"oneOf":[{}],"uniqueKey":"trigger.oneOf.4.inputSchema","typeLabel":"any"}},"additionalProperties":false,"uniqueKey":"trigger.oneOf.4","typeLabel":"WorkflowTrigger · object"}],"uniqueKey":"trigger","typeLabel":"WorkflowTrigger · object"},"maxCreditsPerRun":{"oneOf":[{"type":"integer","exclusiveMinimum":0,"description":"Optional per-run credit ceiling.","uniqueKey":"maxCreditsPerRun.oneOf.0","typeLabel":"integer"},{"type":"null","exclusiveMinimum":0,"description":"Optional per-run credit ceiling.","uniqueKey":"maxCreditsPerRun.oneOf.1","typeLabel":"null"}],"uniqueKey":"maxCreditsPerRun","typeLabel":"integer | null"}},"required":["name","plan"],"additionalProperties":false,"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"name":"\u003cstring>","plan":{"nodes":[{"id":"\u003cstring>","kind":"BLOCK","blockId":"\u003cstring>","inputs":{},"next":["\u003cstring>"]}],"name":"\u003cstring>"},"importSources":[{"previewId":"\u003cstring>","maxCount":123,"nodeId":"\u003cstring>"}],"trigger":{"type":"MANUAL"},"maxCreditsPerRun":123}}},"exampleType":"generated"}},"exampleType":"generated"},"responses":{"fbbb46de-3461-4689-b2fe-5dc5047eec12":{"description":"Plan is valid","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["success"],"isRequired":true,"uniqueKey":"status","typeLabel":"enum\u003cstring>"},"message":{"type":"string","isRequired":true,"uniqueKey":"message","typeLabel":"string"},"data":{"type":"object","properties":{"isValid":{"type":"boolean","isRequired":true,"uniqueKey":"data.isValid","typeLabel":"boolean"},"warnings":{"type":"array","items":{"type":"string","uniqueKey":"data.warnings.items.[INDEX]","typeLabel":"string"},"description":"Non-blocking validation warnings.","isRequired":true,"uniqueKey":"data.warnings","typeLabel":"string[]"},"plan":{"type":"object","properties":{"nodes":{"type":"array","items":{"oneOf":[{"type":"object","title":"BLOCK","required":["id","kind","blockId","inputs","next"],"properties":{"id":{"type":"string","minLength":1,"maxLength":128,"description":"Stable node id (any non-empty string).","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.0.id","typeLabel":"string"},"kind":{"type":"string","enum":["BLOCK"],"isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.0.kind","typeLabel":"enum\u003cstring>"},"blockId":{"type":"string","minLength":1,"description":"Block id from `GET /v1/workflows/blocks`.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.0.blockId","typeLabel":"string"},"inputs":{"type":"object","additionalProperties":{"oneOf":[{}],"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.0.inputs.additionalProperties","typeLabel":"any"},"description":"Configured inputs for the block.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.0.inputs","typeLabel":"object"},"next":{"type":"array","items":{"type":"string","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.0.next.items.[INDEX]","typeLabel":"string"},"maxItems":2,"description":"Outgoing node ids. One slot, or two for two-outlet blocks: `[approved, rejected]` for WAIT_FOR_APPROVAL, `[changed, unchanged]` for CHECK_LEAD_FOR_CHANGES. `\"\"` = unwired.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.0.next","typeLabel":"string[]"}},"additionalProperties":false,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.0","typeLabel":"BLOCK · object"},{"type":"object","title":"CONDITIONAL","required":["id","kind","conditions","next"],"properties":{"id":{"type":"string","minLength":1,"maxLength":128,"isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.id","typeLabel":"string"},"kind":{"type":"string","enum":["CONDITIONAL"],"isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.kind","typeLabel":"enum\u003cstring>"},"conditions":{"type":"array","items":{"oneOf":[{"type":"object","title":"FieldCondition","required":["field","operator"],"properties":{"field":{"type":"string","description":"Condition field id/name. See `GET /v1/workflows/condition-fields`.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.field","typeLabel":"string"},"operator":{"type":"string","description":"Condition operator id. See `GET /v1/workflows/condition-fields`.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.operator","typeLabel":"string"},"name":{"type":"string","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.name","typeLabel":"string"},"value":{"oneOf":[{"type":"string","description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.0","typeLabel":"string"},{"type":"number","description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.1","typeLabel":"number"},{"type":"boolean","description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.2","typeLabel":"boolean"},{"type":"array","items":{"type":"string","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.3.items.[INDEX]","typeLabel":"string"},"description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.3","typeLabel":"string[]"},{"type":"array","items":{"type":"number","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.4.items.[INDEX]","typeLabel":"number"},"description":"Comparison value. Omitted for emptiness operators (IS_EMPTY / IS_NOT_EMPTY).","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value.oneOf.4","typeLabel":"number[]"}],"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0.value","typeLabel":"string | number | boolean | string[] | number[]"}},"additionalProperties":false,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.0","typeLabel":"FieldCondition · object"},{"type":"object","title":"RandomSplitCondition","required":["type","percentage"],"properties":{"type":{"type":"string","enum":["RANDOM_SPLIT"],"isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.1.type","typeLabel":"enum\u003cstring>"},"percentage":{"type":"integer","minimum":1,"maximum":100,"description":"Share of entities (integer 1-100) deterministically routed to this branch. Sibling split percentages must sum to ≤ 100; the remainder falls through to the fallback branch.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.1.percentage","typeLabel":"integer"},"name":{"type":"string","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.1.name","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX].oneOf.1","typeLabel":"RandomSplitCondition · object"}],"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions.items.[INDEX]","typeLabel":"FieldCondition · object | RandomSplitCondition · object"},"minItems":1,"maxItems":20,"isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.conditions","typeLabel":"(FieldCondition · object | RandomSplitCondition · object)[]"},"next":{"type":"array","items":{"type":"string","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.next.items.[INDEX]","typeLabel":"string"},"description":"One target per condition (in order) then the fallback LAST. Length = conditions.length + 1.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.next","typeLabel":"string[]"},"fallbackName":{"type":"string","maxLength":120,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1.fallbackName","typeLabel":"string"}},"additionalProperties":false,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.1","typeLabel":"CONDITIONAL · object"},{"type":"object","title":"KING","required":["id","kind","groupBy","orderBy","next"],"properties":{"id":{"type":"string","minLength":1,"maxLength":128,"isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.id","typeLabel":"string"},"kind":{"type":"string","enum":["KING"],"isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.kind","typeLabel":"enum\u003cstring>"},"groupBy":{"type":"string","minLength":1,"description":"Field used to group records.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.groupBy","typeLabel":"string"},"orderBy":{"type":"number","description":"Formula field id used to sort every group ascending.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.orderBy","typeLabel":"number"},"next":{"type":"array","items":{"type":"string","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.next.items.[INDEX]","typeLabel":"string"},"maxItems":2,"description":"`[prioritizedTargetId, remainingTargetId]`.","isRequired":true,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.next","typeLabel":"string[]"},"checkAnyDomain":{"type":"boolean","description":"For domain/website groups, match domain names regardless of suffix.","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.checkAnyDomain","typeLabel":"boolean"},"limit":{"oneOf":[{"type":"number","description":"Exact number of records to prioritize from each group.","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.limit.oneOf.0","typeLabel":"number"},{"type":"null","description":"Exact number of records to prioritize from each group.","uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.limit.oneOf.1","typeLabel":"null"}],"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2.limit","typeLabel":"number | null"}},"additionalProperties":false,"uniqueKey":"data.plan.nodes.items.[INDEX].oneOf.2","typeLabel":"KING · object"}],"uniqueKey":"data.plan.nodes.items.[INDEX]","typeLabel":"BLOCK · object | CONDITIONAL · object | KING · object"},"maxItems":60,"description":"At most 60 nodes; no cycles.","isRequired":true,"uniqueKey":"data.plan.nodes","typeLabel":"(BLOCK · object | CONDITIONAL · object | KING · object)[]"},"name":{"type":"string","minLength":1,"maxLength":120,"uniqueKey":"data.plan.name","typeLabel":"string"}},"required":["nodes"],"additionalProperties":false,"title":"WorkflowPlan","description":"Normalized plan with exact source inputs; returned only when importSources were supplied.","uniqueKey":"data.plan","typeLabel":"WorkflowPlan · object"},"errors":{"type":"array","items":{"type":"string","uniqueKey":"data.errors.items.[INDEX]","typeLabel":"string"},"description":"Blocking validation errors when `isValid` is false.","uniqueKey":"data.errors","typeLabel":"string[]"}},"required":["isValid","warnings"],"isRequired":true,"uniqueKey":"data","typeLabel":"object"}},"required":["status","message","data"],"uniqueKey":"","typeLabel":"object"},"examples":{"Example":{"title":"Example","value":{"status":"success","message":"\u003cstring>","data":{"isValid":true,"warnings":["\u003cstring>"],"plan":{"nodes":[{"id":"\u003cstring>","kind":"BLOCK","blockId":"\u003cstring>","inputs":{},"next":["\u003cstring>"]}],"name":"\u003cstring>"},"errors":["\u003cstring>"]}}}},"exampleType":"generated"}},"exampleType":"generated"},"87ec8415-b4bd-4ec9-9b31-d221d93af68e":{"description":"The plan is structurally invalid (malformed graph).","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"cf1ad34c-9cec-4fcb-953c-24cc95f46b6f":{"description":"Advanced workflows are not enabled for this workspace. Ask your workspace admin to enable the feature.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"d85764da-de2c-41f2-a810-d82748651498":{"description":"An import source preview is unavailable, expired, or inaccessible.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}},"cc16f857-b215-49a2-a25f-b0adb8138fe8":{"description":"The plan or import source fails block/config validation.","content":{"_mintlify/placeholder":{"schema":{"type":"object","description":""}}}}},"security":{"d9ec1ee2-6487-4789-abd2-a3c70837fac6":{"apiKey":{"type":"apiKey","in":"header","name":"x-api-key","scopes":[],"schemeName":"apiKey"}}},"servers":{"0583bc01-7d89-47ba-9860-852cd05faae2":{"url":"https://openapi.enginy.ai","description":"Configured server"}},"processedSecurityOptions":[{"schemes":[{"scheme":{"type":"apiKey","in":"header","name":"x-api-key","scopes":[],"schemeName":"apiKey"},"schema":{"title":"x-api-key","type":"string","isRequired":true,"typeLabel":"string","deprecated":false},"schemeName":"apiKey","name":"x-api-key"}],"title":"apiKey"}]},"originalFileLocation":"https://openapi.enginy.ai/definitions.json"},"subdomain":"genesyai","siteName":"Enginy API Docs","title":"Validate workflow - Enginy API Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-23T06:52:02.704Z","originalFileLocation":"api-reference/workflows/validate-workflow.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Validate a workflow plan payload without creating anything. Strict validation (as if publishing). Returns isValid with warnings, or errors. A workflow is a DAG of nodes described by the plan object: { name?, nodes: [] }. Each node has a stable string id and a next array of node ids it points to (an empty string \u0026quot;\u0026quot; marks an unwired slot). There are three node kinds: - BLOCK — one workflow step. { id, kind: \u0026quot;BLOCK\u0026quot;, blockId, inputs: {}, next: [] }. blockId comes from GET /v1/workflows/blocks; inputs are the block\u0026#x27;s configurable inputs (discover them with GET /v1/workflows/blocks/{blockId}). A BLOCK has exactly one next slot, except two-outlet blocks: WAIT_FOR_APPROVAL has [approvedTargetId, rejectedTargetId] and CHECK_LEAD_FOR_CHANGES has [changedTargetId, unchangedTargetId]. Put configured values in a BLOCK\u0026#x27;s inputs, never the input-catalog metadata. For a WEBHOOK trigger\u0026#x27;s declared non-entity input, bind the matching field as { \u0026quot;webhookInputKey\u0026quot;: \u0026quot;\u0026quot; } (for example inputs.companyPayload = { \u0026quot;webhookInputKey\u0026quot;: \u0026quot;companyPayload\u0026quot; }). Entity inputs such as leadIds and companyIds use \u0026quot;__MANUAL_INPUT\u0026quot; on the entry block instead. - CONDITIONAL — branches the stream. { id, kind: \u0026quot;CONDITIONAL\u0026quot;, conditions: [], fallbackName?, next: [] }. Each condition is EITHER a field predicate { field, operator, value? } (lead/company/AI-variable fields — discover them with GET /v1/workflows/condition-fields) OR a random-split branch { type: \u0026quot;RANDOM_SPLIT\u0026quot;, percentage } (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). next has exactly conditions.length + 1 entries: one target per matched condition (in order) then the fallback target LAST. - KING (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. { id, kind: \u0026quot;KING\u0026quot;, groupBy, orderBy, checkAnyDomain?, limit?, next: [] }. next is [prioritizedTargetId, remainingTargetId]. Use importSources: [{ nodeId, previewId, maxCount }] to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from GET /v1/workflows/import-inputs; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow. The first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (nodes: []) is valid for a brand-new draft. Field/entity prefixes used inside conditions: company., anyLead., and webhookInput. for webhook-triggered workflows. \u0026gt; Required scope: WORKFLOWS_WRITE \u0026gt; \u0026gt; Rate limit: 30 requests per minute\">\u003cmeta data-mint-head name=\"application-name\" content=\"Enginy API Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Validate workflow - Enginy API Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Validate a workflow plan payload without creating anything. Strict validation (as if publishing). Returns isValid with warnings, or errors. A workflow is a DAG of nodes described by the plan object: { name?, nodes: [] }. Each node has a stable string id and a next array of node ids it points to (an empty string \u0026quot;\u0026quot; marks an unwired slot). There are three node kinds: - BLOCK — one workflow step. { id, kind: \u0026quot;BLOCK\u0026quot;, blockId, inputs: {}, next: [] }. blockId comes from GET /v1/workflows/blocks; inputs are the block\u0026#x27;s configurable inputs (discover them with GET /v1/workflows/blocks/{blockId}). A BLOCK has exactly one next slot, except two-outlet blocks: WAIT_FOR_APPROVAL has [approvedTargetId, rejectedTargetId] and CHECK_LEAD_FOR_CHANGES has [changedTargetId, unchangedTargetId]. Put configured values in a BLOCK\u0026#x27;s inputs, never the input-catalog metadata. For a WEBHOOK trigger\u0026#x27;s declared non-entity input, bind the matching field as { \u0026quot;webhookInputKey\u0026quot;: \u0026quot;\u0026quot; } (for example inputs.companyPayload = { \u0026quot;webhookInputKey\u0026quot;: \u0026quot;companyPayload\u0026quot; }). Entity inputs such as leadIds and companyIds use \u0026quot;__MANUAL_INPUT\u0026quot; on the entry block instead. - CONDITIONAL — branches the stream. { id, kind: \u0026quot;CONDITIONAL\u0026quot;, conditions: [], fallbackName?, next: [] }. Each condition is EITHER a field predicate { field, operator, value? } (lead/company/AI-variable fields — discover them with GET /v1/workflows/condition-fields) OR a random-split branch { type: \u0026quot;RANDOM_SPLIT\u0026quot;, percentage } (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). next has exactly conditions.length + 1 entries: one target per matched condition (in order) then the fallback target LAST. - KING (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. { id, kind: \u0026quot;KING\u0026quot;, groupBy, orderBy, checkAnyDomain?, limit?, next: [] }. next is [prioritizedTargetId, remainingTargetId]. Use importSources: [{ nodeId, previewId, maxCount }] to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from GET /v1/workflows/import-inputs; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow. The first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (nodes: []) is valid for a brand-new draft. Field/entity prefixes used inside conditions: company., anyLead., and webhookInput. for webhook-triggered workflows. \u0026gt; Required scope: WORKFLOWS_WRITE \u0026gt; \u0026gt; Rate limit: 30 requests per minute\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Enginy API Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.enginy.ai/api-reference/workflows/validate-workflow\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://genesyai.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Validate+workflow\u0026amp;description=Validate+a+workflow+%60plan%60+payload+without+creating+anything.+Strict+validation+%28as+if+publishing%29.+Returns+%60isValid%60+with+warnings%2C+or+errors.%0A%0AA+workflow+is+a\u0026amp;theme=f2b1053b8a2ac574395c5658\u0026amp;signature=d671f77482bbe11f46261823d4632cd9f0517b46892e79d7b1426f88e761122f\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Validate workflow - Enginy API Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Validate a workflow plan payload without creating anything. Strict validation (as if publishing). Returns isValid with warnings, or errors. A workflow is a DAG of nodes described by the plan object: { name?, nodes: [] }. Each node has a stable string id and a next array of node ids it points to (an empty string \u0026quot;\u0026quot; marks an unwired slot). There are three node kinds: - BLOCK — one workflow step. { id, kind: \u0026quot;BLOCK\u0026quot;, blockId, inputs: {}, next: [] }. blockId comes from GET /v1/workflows/blocks; inputs are the block\u0026#x27;s configurable inputs (discover them with GET /v1/workflows/blocks/{blockId}). A BLOCK has exactly one next slot, except two-outlet blocks: WAIT_FOR_APPROVAL has [approvedTargetId, rejectedTargetId] and CHECK_LEAD_FOR_CHANGES has [changedTargetId, unchangedTargetId]. Put configured values in a BLOCK\u0026#x27;s inputs, never the input-catalog metadata. For a WEBHOOK trigger\u0026#x27;s declared non-entity input, bind the matching field as { \u0026quot;webhookInputKey\u0026quot;: \u0026quot;\u0026quot; } (for example inputs.companyPayload = { \u0026quot;webhookInputKey\u0026quot;: \u0026quot;companyPayload\u0026quot; }). Entity inputs such as leadIds and companyIds use \u0026quot;__MANUAL_INPUT\u0026quot; on the entry block instead. - CONDITIONAL — branches the stream. { id, kind: \u0026quot;CONDITIONAL\u0026quot;, conditions: [], fallbackName?, next: [] }. Each condition is EITHER a field predicate { field, operator, value? } (lead/company/AI-variable fields — discover them with GET /v1/workflows/condition-fields) OR a random-split branch { type: \u0026quot;RANDOM_SPLIT\u0026quot;, percentage } (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). next has exactly conditions.length + 1 entries: one target per matched condition (in order) then the fallback target LAST. - KING (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. { id, kind: \u0026quot;KING\u0026quot;, groupBy, orderBy, checkAnyDomain?, limit?, next: [] }. next is [prioritizedTargetId, remainingTargetId]. Use importSources: [{ nodeId, previewId, maxCount }] to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from GET /v1/workflows/import-inputs; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow. The first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (nodes: []) is valid for a brand-new draft. Field/entity prefixes used inside conditions: company., anyLead., and webhookInput. for webhook-triggered workflows. \u0026gt; Required scope: WORKFLOWS_WRITE \u0026gt; \u0026gt; Rate limit: 30 requests per minute\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://genesyai.mintlify.app/_mintlify/api/og/v2?division=Workflows\u0026amp;title=Validate+workflow\u0026amp;description=Validate+a+workflow+%60plan%60+payload+without+creating+anything.+Strict+validation+%28as+if+publishing%29.+Returns+%60isValid%60+with+warnings%2C+or+errors.%0A%0AA+workflow+is+a\u0026amp;theme=f2b1053b8a2ac574395c5658\u0026amp;signature=d671f77482bbe11f46261823d4632cd9f0517b46892e79d7b1426f88e761122f\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/genesyai/KC8b0RpuY3wjR47N/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Enginy API Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#1EC371\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.enginy.ai/api-reference/workflows/validate-workflow\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/api-reference/workflows/validate-workflow.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.enginy.ai/#organization\",\"name\":\"Enginy API Docs\",\"url\":\"https://docs.enginy.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/genesyai/WDIQAoU7a8DJAxu4/logo/enginy-dark.svg?fit=max\u0026auto=format\u0026n=WDIQAoU7a8DJAxu4\u0026q=85\u0026s=939acf98e42633af0faae66d57713e73\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.enginy.ai#website\",\"name\":\"Enginy API Docs\",\"url\":\"https://docs.enginy.ai\",\"publisher\":{\"@id\":\"https://docs.enginy.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.enginy.ai/api-reference/workflows/validate-workflow#webpage\",\"url\":\"https://docs.enginy.ai/api-reference/workflows/validate-workflow\",\"name\":\"Validate workflow\",\"description\":\"Validate a workflow plan payload without creating anything. Strict validation (as if publishing). Returns isValid with warnings, or errors. A workflow is a DAG of nodes described by the plan object: { name?, nodes: [] }. Each node has a stable string id and a next array of node ids it points to (an empty string \\\"\\\" marks an unwired slot). There are three node kinds: - BLOCK — one workflow step. { id, kind: \\\"BLOCK\\\", blockId, inputs: {}, next: [] }. blockId comes from GET /v1/workflows/blocks; inputs are the block's configurable inputs (discover them with GET /v1/workflows/blocks/{blockId}). A BLOCK has exactly one next slot, except two-outlet blocks: WAIT_FOR_APPROVAL has [approvedTargetId, rejectedTargetId] and CHECK_LEAD_FOR_CHANGES has [changedTargetId, unchangedTargetId]. Put configured values in a BLOCK's inputs, never the input-catalog metadata. For a WEBHOOK trigger's declared non-entity input, bind the matching field as { \\\"webhookInputKey\\\": \\\"\\\" } (for example inputs.companyPayload = { \\\"webhookInputKey\\\": \\\"companyPayload\\\" }). Entity inputs such as leadIds and companyIds use \\\"__MANUAL_INPUT\\\" on the entry block instead. - CONDITIONAL — branches the stream. { id, kind: \\\"CONDITIONAL\\\", conditions: [], fallbackName?, next: [] }. Each condition is EITHER a field predicate { field, operator, value? } (lead/company/AI-variable fields — discover them with GET /v1/workflows/condition-fields) OR a random-split branch { type: \\\"RANDOM_SPLIT\\\", percentage } (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). next has exactly conditions.length + 1 entries: one target per matched condition (in order) then the fallback target LAST. - KING (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. { id, kind: \\\"KING\\\", groupBy, orderBy, checkAnyDomain?, limit?, next: [] }. next is [prioritizedTargetId, remainingTargetId]. Use importSources: [{ nodeId, previewId, maxCount }] to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from GET /v1/workflows/import-inputs; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow. The first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (nodes: []) is valid for a brand-new draft. Field/entity prefixes used inside conditions: company., anyLead., and webhookInput. for webhook-triggered workflows. > Required scope: WORKFLOWS_WRITE > > Rate limit: 30 requests per minute\",\"dateModified\":\"2026-10-23T06:52:02.704Z\",\"isPartOf\":{\"@id\":\"https://docs.enginy.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.enginy.ai/api-reference/workflows/validate-workflow#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.enginy.ai/api-reference/workflows/validate-workflow#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Endpoints\",\"item\":\"https://docs.enginy.ai/api-reference/ai-variables/list-contact-ai-variable-folders\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Workflows\",\"item\":\"https://docs.enginy.ai/api-reference/workflows/get-workflow-blocks\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Validate workflow\",\"item\":\"https://docs.enginy.ai/api-reference/workflows/validate-workflow\"}]},{\"@type\":[\"TechArticle\",\"APIReference\"],\"@id\":\"https://docs.enginy.ai/api-reference/workflows/validate-workflow#apireference\",\"headline\":\"Validate workflow\",\"name\":\"Validate workflow\",\"description\":\"Validate a workflow plan payload without creating anything. Strict validation (as if publishing). Returns isValid with warnings, or errors. A workflow is a DAG of nodes described by the plan object: { name?, nodes: [] }. Each node has a stable string id and a next array of node ids it points to (an empty string \\\"\\\" marks an unwired slot). There are three node kinds: - BLOCK — one workflow step. { id, kind: \\\"BLOCK\\\", blockId, inputs: {}, next: [] }. blockId comes from GET /v1/workflows/blocks; inputs are the block's configurable inputs (discover them with GET /v1/workflows/blocks/{blockId}). A BLOCK has exactly one next slot, except two-outlet blocks: WAIT_FOR_APPROVAL has [approvedTargetId, rejectedTargetId] and CHECK_LEAD_FOR_CHANGES has [changedTargetId, unchangedTargetId]. Put configured values in a BLOCK's inputs, never the input-catalog metadata. For a WEBHOOK trigger's declared non-entity input, bind the matching field as { \\\"webhookInputKey\\\": \\\"\\\" } (for example inputs.companyPayload = { \\\"webhookInputKey\\\": \\\"companyPayload\\\" }). Entity inputs such as leadIds and companyIds use \\\"__MANUAL_INPUT\\\" on the entry block instead. - CONDITIONAL — branches the stream. { id, kind: \\\"CONDITIONAL\\\", conditions: [], fallbackName?, next: [] }. Each condition is EITHER a field predicate { field, operator, value? } (lead/company/AI-variable fields — discover them with GET /v1/workflows/condition-fields) OR a random-split branch { type: \\\"RANDOM_SPLIT\\\", percentage } (deterministic A/B split; integer 1-100, percentages must sum to ≤ 100 across the node, the remainder falls through to the fallback). next has exactly conditions.length + 1 entries: one target per matched condition (in order) then the fallback target LAST. - KING (shown as Prioritize by group) — groups records, sorts each group ascending by a formula field, and routes an exact number from every group separately from the remainder. { id, kind: \\\"KING\\\", groupBy, orderBy, checkAnyDomain?, limit?, next: [] }. next is [prioritizedTargetId, remainingTargetId]. Use importSources: [{ nodeId, previewId, maxCount }] to materialize source inputs from AI Finder previews server-side. The target BLOCK must use the resolved blockId from GET /v1/workflows/import-inputs; its inputs can be empty. Resolved source fields overwrite copied inputs, while extra inputs are preserved. References expire with the preview and are never persisted in the workflow. The first node (the one no other node points to) should be a selector/import entry block. A plan may hold at most 60 nodes and no cycles. An empty plan (nodes: []) is valid for a brand-new draft. Field/entity prefixes used inside conditions: company., anyLead., and webhookInput. for webhook-triggered workflows. > Required scope: WORKFLOWS_WRITE > > Rate limit: 30 requests per minute\",\"url\":\"https://docs.enginy.ai/api-reference/workflows/validate-workflow\",\"mainEntityOfPage\":{\"@id\":\"https://docs.enginy.ai/api-reference/workflows/validate-workflow#webpage\"},\"dateModified\":\"2026-10-23T06:52:02.704Z\",\"publisher\":{\"@id\":\"https://docs.enginy.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.enginy.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Enginy API Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Enginy API Docs","nav":{"global":{"anchors":[{"anchor":"Help Center","icon":"book-open-cover","href":"https://help.enginy.ai/"},{"anchor":"API Dashboard","icon":"key","href":"https://app.enginy.ai/api-access"}]},"tabs":[{"tab":"Guides","pages":[{"title":"Guides","href":""}]},{"tab":"API reference","groups":[{"group":"API documentation","pages":[{"title":"Introduction","icon":"compass","href":"/api-reference/introduction"},{"title":"Searching Contacts And Companies","icon":"magnifying-glass","href":"/api-reference/searching-contacts-companies"},{"title":"Contact and Company Tags","icon":"tags","href":"/api-reference/contact-company-tags-guide"},{"title":"Campaign Creation Guide","icon":"paper-plane","href":"/api-reference/campaigns-guide"},{"title":"Identities Guide","icon":"id-badge","href":"/api-reference/identities-guide"},{"title":"Rate Limits","icon":"gauge-high","href":"/api-reference/rate-limits"},{"title":"Actions guide","icon":"bolt","href":"/api-reference/actions-guide"},{"title":"AI Variables","icon":"wand-magic-sparkles","href":"/api-reference/ai-variables-guide"},{"title":"AI Playbook","icon":"book-open","href":"/api-reference/ai-playbook-guide"},{"title":"Webhooks guide","icon":"webhook","href":"/api-reference/webhooks-guide"},{"title":"Workflows API Overview","icon":"diagram-project","href":"/api-reference/workflows-guide"},{"title":"Workflows API Cookbook","icon":"book-open","href":"/api-reference/workflows-cookbook"},{"title":"Social Selling","href":"/api-reference/social-selling-guide"}]},{"group":"Endpoints","pages":[{"group":"AI Variables","pages":[{"title":"List contact AI variable folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/contacts","href":"/api-reference/ai-variables/list-contact-ai-variable-folders"},{"title":"Create contact AI variable folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables/folders/contacts","href":"/api-reference/ai-variables/create-contact-ai-variable-folder"},{"title":"Get contact AI variable folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/contacts/{folderId}","href":"/api-reference/ai-variables/get-contact-ai-variable-folder"},{"title":"Delete contact AI variable folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/folders/contacts/{folderId}","href":"/api-reference/ai-variables/delete-contact-ai-variable-folder"},{"title":"Update contact AI variable folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/folders/contacts/{folderId}","href":"/api-reference/ai-variables/update-contact-ai-variable-folder"},{"title":"List company AI variable folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/companies","href":"/api-reference/ai-variables/list-company-ai-variable-folders"},{"title":"Create company AI variable folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables/folders/companies","href":"/api-reference/ai-variables/create-company-ai-variable-folder"},{"title":"Get company AI variable folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/companies/{folderId}","href":"/api-reference/ai-variables/get-company-ai-variable-folder"},{"title":"Delete company AI variable folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/folders/companies/{folderId}","href":"/api-reference/ai-variables/delete-company-ai-variable-folder"},{"title":"Update company AI variable folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/folders/companies/{folderId}","href":"/api-reference/ai-variables/update-company-ai-variable-folder"},{"title":"List AI message folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/ai-messages","href":"/api-reference/ai-variables/list-ai-message-folders"},{"title":"Create AI message folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables/folders/ai-messages","href":"/api-reference/ai-variables/create-ai-message-folder"},{"title":"Get AI message folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/ai-messages/{folderId}","href":"/api-reference/ai-variables/get-ai-message-folder"},{"title":"Delete AI message folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/folders/ai-messages/{folderId}","href":"/api-reference/ai-variables/delete-ai-message-folder"},{"title":"Update AI message folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/folders/ai-messages/{folderId}","href":"/api-reference/ai-variables/update-ai-message-folder"},{"title":"List AI snippet folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/ai-snippets","href":"/api-reference/ai-variables/list-ai-snippet-folders"},{"title":"Create AI snippet folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables/folders/ai-snippets","href":"/api-reference/ai-variables/create-ai-snippet-folder"},{"title":"Get AI snippet folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/ai-snippets/{folderId}","href":"/api-reference/ai-variables/get-ai-snippet-folder"},{"title":"Delete AI snippet folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/folders/ai-snippets/{folderId}","href":"/api-reference/ai-variables/delete-ai-snippet-folder"},{"title":"Update AI snippet folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/folders/ai-snippets/{folderId}","href":"/api-reference/ai-variables/update-ai-snippet-folder"},{"title":"List message template folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/message-templates","href":"/api-reference/ai-variables/list-message-template-folders"},{"title":"Create message template folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables/folders/message-templates","href":"/api-reference/ai-variables/create-message-template-folder"},{"title":"Get message template folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/folders/message-templates/{folderId}","href":"/api-reference/ai-variables/get-message-template-folder"},{"title":"Delete message template folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/folders/message-templates/{folderId}","href":"/api-reference/ai-variables/delete-message-template-folder"},{"title":"Update message template folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/folders/message-templates/{folderId}","href":"/api-reference/ai-variables/update-message-template-folder"},{"title":"List AI messages","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/ai-messages","href":"/api-reference/ai-variables/list-ai-messages"},{"title":"Create an ai message","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables/ai-messages","href":"/api-reference/ai-variables/create-an-ai-message"},{"title":"List AI snippets","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/ai-snippets","href":"/api-reference/ai-variables/list-ai-snippets"},{"title":"Create an ai snippet","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables/ai-snippets","href":"/api-reference/ai-variables/create-an-ai-snippet"},{"title":"List message templates","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/message-templates","href":"/api-reference/ai-variables/list-message-templates"},{"title":"Create a message template","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables/message-templates","href":"/api-reference/ai-variables/create-a-message-template"},{"title":"Get an ai message","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/ai-messages/{aiMessageId}","href":"/api-reference/ai-variables/get-an-ai-message"},{"title":"Delete an ai message","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/ai-messages/{aiMessageId}","href":"/api-reference/ai-variables/delete-an-ai-message"},{"title":"Update an ai message","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/ai-messages/{aiMessageId}","href":"/api-reference/ai-variables/update-an-ai-message"},{"title":"Get an ai snippet","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/ai-snippets/{aiSnippetId}","href":"/api-reference/ai-variables/get-an-ai-snippet"},{"title":"Delete an ai snippet","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/ai-snippets/{aiSnippetId}","href":"/api-reference/ai-variables/delete-an-ai-snippet"},{"title":"Update an ai snippet","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/ai-snippets/{aiSnippetId}","href":"/api-reference/ai-variables/update-an-ai-snippet"},{"title":"Get a message template","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/message-templates/{messageTemplateId}","href":"/api-reference/ai-variables/get-a-message-template"},{"title":"Delete a message template","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/message-templates/{messageTemplateId}","href":"/api-reference/ai-variables/delete-a-message-template"},{"title":"Update a message template","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/message-templates/{messageTemplateId}","href":"/api-reference/ai-variables/update-a-message-template"},{"title":"List AI message tones","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/ai-message-tones","href":"/api-reference/ai-variables/list-ai-message-tones"},{"title":"List AI variables","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables","href":"/api-reference/ai-variables/list-ai-variables"},{"title":"Create an AI variable","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-variables","href":"/api-reference/ai-variables/create-an-ai-variable"},{"title":"Get an AI variable","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-variables/{aiVariableId}","href":"/api-reference/ai-variables/get-an-ai-variable"},{"title":"Delete an AI variable","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/ai-variables/{aiVariableId}","href":"/api-reference/ai-variables/delete-an-ai-variable"},{"title":"Update an AI variable","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/ai-variables/{aiVariableId}","href":"/api-reference/ai-variables/update-an-ai-variable"}]},{"group":"Contacts","pages":[{"title":"Get contact field metadata","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/contacts/fields","href":"/api-reference/contacts/get-contact-field-metadata"},{"title":"Create a contact custom field","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/contacts/fields","href":"/api-reference/contacts/create-a-contact-custom-field"},{"title":"Get contacts","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/contacts","href":"/api-reference/contacts/get-contacts"},{"title":"Search contacts with advanced filters","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/contacts/search","href":"/api-reference/contacts/search-contacts-with-advanced-filters"},{"title":"Get a single contact","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/contact/{contactId}","href":"/api-reference/contacts/get-a-single-contact"},{"title":"Delete a contact","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/contact/{contactId}","href":"/api-reference/contacts/delete-a-contact"},{"title":"Update contact fields","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/contact/{contactId}","href":"/api-reference/contacts/update-contact-fields"},{"title":"Create a new contact","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/contact","href":"/api-reference/contacts/create-a-new-contact"},{"title":"Bulk create contacts","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/contacts/bulk","href":"/api-reference/contacts/bulk-create-contacts"},{"title":"Get contact tags","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/contacts/tags","href":"/api-reference/contacts/get-contact-tags"},{"title":"Create a contact tag","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/contacts/tags","href":"/api-reference/contacts/create-a-contact-tag"},{"title":"Delete a contact tag","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/contacts/tag/{tagId}","href":"/api-reference/contacts/delete-a-contact-tag"},{"title":"Update a contact tag","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/contacts/tag/{tagId}","href":"/api-reference/contacts/update-a-contact-tag"},{"title":"Add tags to contacts","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/contacts/tags/add","href":"/api-reference/contacts/add-tags-to-contacts"},{"title":"Remove tags from contacts","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/contacts/tags/remove","href":"/api-reference/contacts/remove-tags-from-contacts"},{"title":"Find duplicate contacts","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/contacts/duplicates","href":"/api-reference/contacts/find-duplicate-contacts"}]},{"group":"Companies","pages":[{"title":"Get company field metadata","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/companies/fields","href":"/api-reference/companies/get-company-field-metadata"},{"title":"Create a new company","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/company","href":"/api-reference/companies/create-a-new-company"},{"title":"Bulk create companies","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/companies/bulk","href":"/api-reference/companies/bulk-create-companies"},{"title":"Get companies","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/companies","href":"/api-reference/companies/get-companies"},{"title":"Search companies with advanced filters","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/companies/search","href":"/api-reference/companies/search-companies-with-advanced-filters"},{"title":"Get a single company","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/company/{companyId}","href":"/api-reference/companies/get-a-single-company"},{"title":"Delete a company","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/company/{companyId}","href":"/api-reference/companies/delete-a-company"},{"title":"Update company fields","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/company/{companyId}","href":"/api-reference/companies/update-company-fields"},{"title":"Get company tags","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/companies/tags","href":"/api-reference/companies/get-company-tags"},{"title":"Create a company tag","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/companies/tags","href":"/api-reference/companies/create-a-company-tag"},{"title":"Delete a company tag","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/companies/tag/{tagId}","href":"/api-reference/companies/delete-a-company-tag"},{"title":"Update a company tag","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/companies/tag/{tagId}","href":"/api-reference/companies/update-a-company-tag"},{"title":"Add tags to companies","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/companies/tags/add","href":"/api-reference/companies/add-tags-to-companies"},{"title":"Remove tags from companies","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/companies/tags/remove","href":"/api-reference/companies/remove-tags-from-companies"},{"title":"Find duplicate companies","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/companies/duplicates","href":"/api-reference/companies/find-duplicate-companies"}]},{"group":"AI Finder","pages":[{"title":"Preview an AI Finder search","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-finder/previews","href":"/api-reference/ai-finder/preview-an-ai-finder-search"},{"title":"Refine an AI Finder preview","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-finder/previews/{previewId}/iterate","href":"/api-reference/ai-finder/refine-an-ai-finder-preview"},{"title":"Import an AI Finder preview","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-finder/previews/{previewId}/import","href":"/api-reference/ai-finder/import-an-ai-finder-preview"},{"title":"Fetch results from an AI Finder preview","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-finder/previews/{previewId}/results","href":"/api-reference/ai-finder/fetch-results-from-an-ai-finder-preview"}]},{"group":"AI Playbook","pages":[{"title":"Get AI playbook","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/ai-playbook","href":"/api-reference/ai-playbook/get-ai-playbook"},{"title":"Update AI playbook","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json put /v1/ai-playbook","href":"/api-reference/ai-playbook/update-ai-playbook"}]},{"group":"Identities","pages":[{"title":"Get identities","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/identities","href":"/api-reference/identities/get-identities"},{"title":"Get identity performance metrics","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/identities/performance","href":"/api-reference/identities/get-identity-performance-metrics"},{"title":"Update identity","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/identities/{identityId}","href":"/api-reference/identities/update-identity"},{"title":"Get identity mailboxes","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/identities/{identityId}/mailboxes","href":"/api-reference/identities/get-identity-mailboxes"},{"title":"Create or update an identity mailbox","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/identities/{identityId}/mailboxes","href":"/api-reference/identities/create-or-update-an-identity-mailbox"}]},{"group":"Campaigns","pages":[{"title":"List campaign folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/campaigns/folders","href":"/api-reference/campaigns/list-campaign-folders"},{"title":"Create campaign folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/campaigns/folders","href":"/api-reference/campaigns/create-campaign-folder"},{"title":"Get campaign folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/campaigns/folders/{folderId}","href":"/api-reference/campaigns/get-campaign-folder"},{"title":"Delete campaign folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/campaigns/folders/{folderId}","href":"/api-reference/campaigns/delete-campaign-folder"},{"title":"Update campaign folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/campaigns/folders/{folderId}","href":"/api-reference/campaigns/update-campaign-folder"},{"title":"Get campaigns","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/campaigns","href":"/api-reference/campaigns/get-campaigns"},{"title":"Create campaign","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/campaigns","href":"/api-reference/campaigns/create-campaign"},{"title":"Validate campaign","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/campaigns/validate","href":"/api-reference/campaigns/validate-campaign"},{"title":"Get a single campaign","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/campaign/{campaignId}","href":"/api-reference/campaigns/get-a-single-campaign"},{"title":"Update a draft campaign","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/campaign/{campaignId}","href":"/api-reference/campaigns/update-a-draft-campaign"},{"title":"Validate campaign draft","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/campaign/{campaignId}/validate-draft","href":"/api-reference/campaigns/validate-campaign-draft"},{"title":"Get campaign analytics","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/campaign/{campaignId}/analytics","href":"/api-reference/campaigns/get-campaign-analytics"},{"title":"Clone a campaign","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/campaign/{campaignId}/clone","href":"/api-reference/campaigns/clone-a-campaign"},{"title":"Update campaign status","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/campaign/{campaignId}/status","href":"/api-reference/campaigns/update-campaign-status"},{"title":"Add a contact to a campaign","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/add-contact-to-campaign","href":"/api-reference/campaigns/add-a-contact-to-a-campaign"},{"title":"Add a contact group to a campaign","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/add-contact-group-to-campaign","href":"/api-reference/campaigns/add-a-contact-group-to-a-campaign"},{"title":"Pause a contact in a campaign","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/pause-contact-in-campaign","href":"/api-reference/campaigns/pause-a-contact-in-a-campaign"},{"title":"Get conversations analytics","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/analytics/conversations","href":"/api-reference/campaigns/get-conversations-analytics"},{"title":"Get conversation messages","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/conversation/:conversationId/messages","href":"/api-reference/campaigns/get-conversation-messages"}]},{"group":"Tasks","pages":[{"title":"Get task owners","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/tasks/owners","href":"/api-reference/tasks/get-task-owners"},{"title":"Get tasks","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/tasks","href":"/api-reference/tasks/get-tasks"},{"title":"Create task","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/tasks","href":"/api-reference/tasks/create-task"},{"title":"Delete tasks","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/tasks","href":"/api-reference/tasks/delete-tasks"},{"title":"Get task IDs","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/tasks/ids","href":"/api-reference/tasks/get-task-ids"},{"title":"Get task status counts","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/tasks/status-counts","href":"/api-reference/tasks/get-task-status-counts"},{"title":"Get task pending count","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/tasks/pending-count","href":"/api-reference/tasks/get-task-pending-count"},{"title":"Update task","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/tasks/{taskId}","href":"/api-reference/tasks/update-task"},{"title":"Complete task","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/tasks/{taskId}/complete","href":"/api-reference/tasks/complete-task"},{"title":"Complete tasks batch","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/tasks/complete-batch","href":"/api-reference/tasks/complete-tasks-batch"},{"title":"Set skipped tasks","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/tasks/skipped","href":"/api-reference/tasks/set-skipped-tasks"}]},{"group":"Voices","pages":[{"title":"Get voices","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/voices","href":"/api-reference/voices/get-voices"}]},{"group":"Lists","pages":[{"title":"List folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/folders","href":"/api-reference/lists/list-folders"},{"title":"List contact list folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/folders/contacts","href":"/api-reference/lists/list-contact-list-folders"},{"title":"Create contact list folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/folders/contacts","href":"/api-reference/lists/create-contact-list-folder"},{"title":"Get contact list folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/folders/contacts/{folderId}","href":"/api-reference/lists/get-contact-list-folder"},{"title":"Delete contact list folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/folders/contacts/{folderId}","href":"/api-reference/lists/delete-contact-list-folder"},{"title":"Update contact list folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/folders/contacts/{folderId}","href":"/api-reference/lists/update-contact-list-folder"},{"title":"List company list folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/folders/companies","href":"/api-reference/lists/list-company-list-folders"},{"title":"Create company list folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/folders/companies","href":"/api-reference/lists/create-company-list-folder"},{"title":"Get company list folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/folders/companies/{folderId}","href":"/api-reference/lists/get-company-list-folder"},{"title":"Delete company list folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/folders/companies/{folderId}","href":"/api-reference/lists/delete-company-list-folder"},{"title":"Update company list folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/folders/companies/{folderId}","href":"/api-reference/lists/update-company-list-folder"},{"title":"Get lists","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/lists","href":"/api-reference/lists/get-lists"},{"title":"Create a list","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/lists","href":"/api-reference/lists/create-a-list"},{"title":"Delete a list","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/lists/{listId}","href":"/api-reference/lists/delete-a-list"},{"title":"Import a list from AI Finder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/ai-finder/import","href":"/api-reference/lists/import-a-list-from-ai-finder"},{"title":"Add contacts to a list","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/lists/{listId}/contacts","href":"/api-reference/lists/add-contacts-to-a-list"},{"title":"Remove contacts from a list","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/lists/{listId}/contacts","href":"/api-reference/lists/remove-contacts-from-a-list"},{"title":"Move contacts between lists","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/lists/{fromListId}/contacts/move","href":"/api-reference/lists/move-contacts-between-lists"},{"title":"Add companies to a list","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/lists/{listId}/companies","href":"/api-reference/lists/add-companies-to-a-list"},{"title":"Remove companies from a list","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/lists/{listId}/companies","href":"/api-reference/lists/remove-companies-from-a-list"},{"title":"Move companies between lists","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/lists/{fromListId}/companies/move","href":"/api-reference/lists/move-companies-between-lists"}]},{"group":"Saved Filters","pages":[{"title":"Get saved filters","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/saved-filters","href":"/api-reference/saved-filters/get-saved-filters"},{"title":"Create a saved filter","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/saved-filters","href":"/api-reference/saved-filters/create-a-saved-filter"},{"title":"Delete a saved filter","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/saved-filters/{savedFilterId}","href":"/api-reference/saved-filters/delete-a-saved-filter"}]},{"group":"Saved Views","pages":[{"title":"Get saved views","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/saved-views","href":"/api-reference/saved-views/get-saved-views"},{"title":"Get saved view","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/saved-views/{savedViewId}","href":"/api-reference/saved-views/get-saved-view"}]},{"group":"Credits","pages":[{"title":"Get credit balance","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/credits","href":"/api-reference/credits/get-credit-balance"},{"title":"Get credit pricing","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/credits/pricing","href":"/api-reference/credits/get-credit-pricing"}]},{"group":"Actions","pages":[{"title":"Start an actions run","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/actions","href":"/api-reference/actions/start-an-actions-run"},{"title":"Get actions run status","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/actions/{actionsId}/status","href":"/api-reference/actions/get-actions-run-status"}]},{"group":"Inbox","pages":[{"title":"List inbox threads","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/inboxes","href":"/api-reference/inbox/list-inbox-threads"},{"title":"Get inbox contact messages","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/inboxes/:contactId/messages","href":"/api-reference/inbox/get-inbox-contact-messages"},{"title":"Build inbox link","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/inbox/link","href":"/api-reference/inbox/build-inbox-link"},{"title":"List inbox tags","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/inbox/tags","href":"/api-reference/inbox/list-inbox-tags"},{"title":"Create inbox tag","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/inbox/tags","href":"/api-reference/inbox/create-inbox-tag"},{"title":"Get inbox tag","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/inbox/tags/:tagId","href":"/api-reference/inbox/get-inbox-tag"},{"title":"Attach inbox tags to a contact thread","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/inbox/contacts/:contactId/tags","href":"/api-reference/inbox/attach-inbox-tags-to-a-contact-thread"},{"title":"Remove inbox tags from a contact thread","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/inbox/contacts/:contactId/tags","href":"/api-reference/inbox/remove-inbox-tags-from-a-contact-thread"},{"title":"Archive inbox contact thread","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/inboxes/:contactId/archive","href":"/api-reference/inbox/archive-inbox-contact-thread"},{"title":"Unarchive inbox contact thread","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/inboxes/:contactId/unarchive","href":"/api-reference/inbox/unarchive-inbox-contact-thread"},{"title":"Mark inbox contact thread as read","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/inboxes/:contactId/read","href":"/api-reference/inbox/mark-inbox-contact-thread-as-read"},{"title":"Send inbox message","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/inbox/messages","href":"/api-reference/inbox/send-inbox-message"}]},{"group":"Webhooks","pages":[{"title":"List webhook subscriptions","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/webhooks","href":"/api-reference/webhooks/list-webhook-subscriptions"},{"title":"Create webhook subscription","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/webhooks","href":"/api-reference/webhooks/create-webhook-subscription"},{"title":"Get webhook subscription","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/webhooks/{webhookId}","href":"/api-reference/webhooks/get-webhook-subscription"},{"title":"Delete webhook subscription","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/webhooks/{webhookId}","href":"/api-reference/webhooks/delete-webhook-subscription"},{"title":"Update webhook subscription","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/webhooks/{webhookId}","href":"/api-reference/webhooks/update-webhook-subscription"},{"title":"Get webhook delivery logs","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/webhooks/{webhookId}/logs","href":"/api-reference/webhooks/get-webhook-delivery-logs"},{"title":"Test webhook subscription","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/webhooks/{webhookId}/test","href":"/api-reference/webhooks/test-webhook-subscription"},{"title":"Actions completed webhook","version":null,"deprecated":null,"openapi":"https://openapi.enginy.ai/definitions.json webhook /your-webhook-url","href":"/api-reference/webhooks/actions-completed-webhook"},{"title":"Conversation events webhook","version":null,"deprecated":null,"openapi":"https://openapi.enginy.ai/definitions.json webhook /your-conversation-webhook-url","href":"/api-reference/webhooks/conversation-events-webhook"}]},{"group":"Blocklist","pages":[{"title":"List blocklist entries","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/blocklist","href":"/api-reference/blocklist/list-blocklist-entries"},{"title":"Add blocklist entries by value","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/blocklist/items","href":"/api-reference/blocklist/add-blocklist-entries-by-value"},{"title":"Block contacts or companies by ID","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/blocklist/add-entities","href":"/api-reference/blocklist/block-contacts-or-companies-by-id"},{"title":"Delete a blocklist entry","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/blocklist/{itemId}","href":"/api-reference/blocklist/delete-a-blocklist-entry"},{"title":"Update a blocklist entry","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/blocklist/{itemId}","href":"/api-reference/blocklist/update-a-blocklist-entry"},{"title":"Delete blocklist entries in bulk","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/blocklist/bulk-delete","href":"/api-reference/blocklist/delete-blocklist-entries-in-bulk"}]},{"group":"Social Selling","pages":[{"title":"List Social Selling posts","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/social-selling/posts","href":"/api-reference/social-selling/list-social-selling-posts"},{"title":"Track a Social Selling post","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/social-selling/posts","href":"/api-reference/social-selling/track-a-social-selling-post"},{"title":"Get a Social Selling post","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/social-selling/posts/{postId}","href":"/api-reference/social-selling/get-a-social-selling-post"},{"title":"Add reactions to a Social Selling post","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/social-selling/posts/{postId}/reactions","href":"/api-reference/social-selling/add-reactions-to-a-social-selling-post"},{"title":"Get Social Selling best publishing times","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/social-selling/analytics/publishing-times","href":"/api-reference/social-selling/get-social-selling-best-publishing-times"},{"title":"Get Social Selling overview","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/social-selling/analytics/overview","href":"/api-reference/social-selling/get-social-selling-overview"},{"title":"List Social Selling identity performance","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/social-selling/analytics/identities","href":"/api-reference/social-selling/list-social-selling-identity-performance"},{"title":"List Social Selling engagers","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/social-selling/engagers","href":"/api-reference/social-selling/list-social-selling-engagers"},{"title":"List Social Selling post engagers","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/social-selling/posts/{postId}/engagers","href":"/api-reference/social-selling/list-social-selling-post-engagers"},{"title":"Preview Social Selling engager export","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/social-selling/engagers/export-preview","href":"/api-reference/social-selling/preview-social-selling-engager-export"},{"title":"Export Social Selling engagers to a list","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/social-selling/engagers/export","href":"/api-reference/social-selling/export-social-selling-engagers-to-a-list"},{"title":"Add a comment to a Social Selling post","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/social-selling/comments","href":"/api-reference/social-selling/add-a-comment-to-a-social-selling-post"},{"title":"Generate Social Selling comment suggestions","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/social-selling/comment-suggestions","href":"/api-reference/social-selling/generate-social-selling-comment-suggestions"},{"title":"List scheduled Social Selling posts","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/social-selling/scheduled-posts","href":"/api-reference/social-selling/list-scheduled-social-selling-posts"},{"title":"Schedule a Social Selling post","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/social-selling/scheduled-posts","href":"/api-reference/social-selling/schedule-a-social-selling-post"},{"title":"Cancel a scheduled Social Selling post","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/social-selling/scheduled-posts/{publishingPostId}","href":"/api-reference/social-selling/cancel-a-scheduled-social-selling-post"}]},{"group":"Workflows","pages":[{"title":"Get workflow blocks","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflows/blocks","href":"/api-reference/workflows/get-workflow-blocks"},{"title":"Get workflow block inputs","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflows/blocks/{blockId}","href":"/api-reference/workflows/get-workflow-block-inputs"},{"title":"Get workflow condition fields","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflows/condition-fields","href":"/api-reference/workflows/get-workflow-condition-fields"},{"title":"Get workflow import inputs","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflows/import-inputs","href":"/api-reference/workflows/get-workflow-import-inputs"},{"title":"Get workflows","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflows","href":"/api-reference/workflows/get-workflows"},{"title":"Create workflow","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/workflows","href":"/api-reference/workflows/create-workflow"},{"title":"List workflow folders","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflows/folders","href":"/api-reference/workflows/list-workflow-folders"},{"title":"Create workflow folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/workflows/folders","href":"/api-reference/workflows/create-workflow-folder"},{"title":"Delete workflow folder","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/workflows/folders/{folderId}","href":"/api-reference/workflows/delete-workflow-folder"},{"title":"Update workflow folder","description":"Update a workflow folder name or parent. Moving a folder into one of its own descendants is not allowed.\n\nResponses include direct Enginy app URLs when available. Responses include an `appUrl` that opens the folder in Enginy. MCP agents should return those URLs to users whenever they are present in the response.\n\n > **Required scope:** `WORKFLOWS_WRITE`\n >\n > **Rate limit:** 30 requests per minute","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/workflows/folders/{folderId}","href":"/api-reference/workflows/update-workflow-folder"},{"title":"Validate workflow","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/workflows/validate","href":"/api-reference/workflows/validate-workflow"},{"title":"Get a single workflow","description":"Get a workflow: its current draft `plan`, trigger, published version, runtime input contract, and a `revision` token for optimistic concurrency on PATCH/publish. For WEBHOOK-triggered workflows the delivery credentials (`webhookUrl`, and `webhookSecret` for write-scoped keys) are issued on publish — a draft has none yet; publish first, then re-read.\n\nResponses include direct Enginy app URLs when available. The response includes an `appUrl` to the workflow editor. MCP agents should return those URLs to users whenever they are present in the response.\n\n > **Required scope:** `WORKFLOWS_READ`\n >\n > **Rate limit:** 100 requests per minute","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflow/{workflowId}","href":"/api-reference/workflows/get-a-single-workflow"},{"title":"Delete workflow","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json delete /v1/workflow/{workflowId}","href":"/api-reference/workflows/delete-workflow"},{"title":"Update workflow draft","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json patch /v1/workflow/{workflowId}/draft","href":"/api-reference/workflows/update-workflow-draft"},{"title":"Validate workflow draft","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflow/{workflowId}/validate-draft","href":"/api-reference/workflows/validate-workflow-draft"},{"title":"Publish workflow","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/workflow/{workflowId}/publish","href":"/api-reference/workflows/publish-workflow"},{"title":"Run workflow","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/workflow/{workflowId}/run","href":"/api-reference/workflows/run-workflow"},{"title":"Get workflow runs","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflow/{workflowId}/runs","href":"/api-reference/workflows/get-workflow-runs"},{"title":"Get workflow run status","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/workflow-runs/{runId}","href":"/api-reference/workflows/get-workflow-run-status"},{"title":"Cancel workflow run","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json post /v1/workflow-runs/{runId}/cancel","href":"/api-reference/workflows/cancel-workflow-run"}]},{"group":"Authentication","pages":[{"title":"Validate API key","deprecated":null,"version":null,"openapi":"https://openapi.enginy.ai/definitions.json get /v1/validate","href":"/api-reference/authentication/validate-api-key"}]}]}]},{"tab":"MCP","pages":[{"title":"MCP","href":"/mcp/overview"}]},{"tab":"Workflows","pages":[{"title":"Workflows","href":"/workflows/overview"}]},{"tab":"Custom CRM","pages":[{"title":"Custom CRM","href":"/api-reference/custom-crm/overview"}]}]},"title":"Validate workflow - Enginy API Docs","buildId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","deploymentId":"dpl_cadrRc5H9XQiJQbDFN5mcYRs2PAj","dynamics":["c2aa737661","2b790eda92","b0f84f53ff","a9bb46feb3"],"chunks":["OpenApiReferenceProvider-DKJwRUt2.js","utils-CWD_VS3u.js","cloneDeep-izs3Hzxb.js","_Uint8Array-BVIqJ90l.js","isObjectLike-C8vmzPEN.js","isArray-Dcu1dQ5t.js","utils-oFjciODD.js","toString-BX-iyh8G.js","isSymbol-CSH9U2Gm.js","addUniqueKeysToSchema-C76WsxC3.js","snippetPresets-DvPMxpX_.js","style-to-object-BY3JEAdk.js","v4-DIgz8zy6.js","ApiExamples-CuNQfndH.js","isEqual-BfaiBbcl.js","usePlaygroundInputsStore-BVFpVUoF.js","shallow-t59Jg5Kr.js","getApiPlaygroundDisplay-C_JZ4amX.js","CodeSnippet-CLRDnx_h.js","CodeSnippets-C2myU4kc.js","Page-7TwLLapg.js","getPastedJson-B-JaVXw7.js","icon-BA-iDhH3.js","MethodPill-D4qZABFp.js","DuplicateIcon-THIDKO1O.js","createIcon-CYYJwgFd.js","DynamicMarkdown-UGQuxDKp.js","SectionHeading-jYELb23h.js","axios-vUo_bRtp.js","Markdown-DKsLa3wy.js","clsx-CefdjKz2.js","lib--scc4DXi.js","lib-B8HbPgcC.js","html-void-elements-mCSPHezU.js","dist-BaREnp3o.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","AssistantPageLink-sgx_0XzF.js"]}