Workflow node reference: control flow and integration nodes
Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.
The Start node is the mandatory first node in any workflow. It defines the input data model and passes this data to subsequent nodes.
Define all required input fields in the Start node to ensure data mapping from processes or user tasks.
Use Workflow Data Models to define structured input and output parameters at the workflow level. Input parameters automatically pre-fill the Start Node from the data model.
Available on SaaS with FlowX.AI 5.12. This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.
A workflow normally runs when something calls it: a process, a parent workflow, or the run button. Turn on an external trigger and it starts on its own, when a webhook is called or an email arrives.Open the Start node, expand External Triggers, switch Enable trigger on, then choose Webhook or Email and pick the data source that receives the event.
External triggers are available on Output Focused workflows only. Configuring one on another workflow type is rejected.
To run a workflow on a schedule on SaaS, add a schedule to its Start node. See How do I run a workflow on a schedule?. Self-hosted deployments get workflow schedules with the next LTS release. Until then, create a process with a Timer Start Event and call the workflow from it with a Start Integration Workflow action. See Scheduled processes.
Before you can pick a webhook, the webhook data source has to be set to Start a Process/Workflow. A data source set to Resume a Waiting Process is refused, and because Webhook Behavior cannot be changed after the first save, a resume webhook can never be reused here: create a new one. See Webhook Behavior.The event lands in the data model. Enabling the trigger adds an entity for the incoming event, and turning the trigger off removes it again, so switch it on before mapping anything downstream.
payload holds the request body as sent, nested structure intact. headers holds each header as a list of strings, so a single-valued header still arrives as a one-element list.A script node can then read it directly:
var msg = input.webhookMessage;var order = msg.payload;output.orderSummary = order.client + " wants " + order.suma + " " + order.detalii.moneda;
Activate the trigger before it accepts anything. Go to Runtime → Manage Triggers and activate it there. The list also shows how many resources each trigger is bound to.
One data source can be bound to several workflows, and a single incoming event then starts all of them. The Manage Triggers list shows this as a resource count above one. Bind a data source to a second workflow only when you mean to run both.
Incoming webhooks
Creating a webhook data source, Webhook Behavior, providers, the URL and its API key
Email trigger
Creating an email trigger data source, filtering, polling, and the email data schema
Available on SaaS with FlowX.AI 6.0. This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.
Add a schedule to the workflow’s Start node, then activate it in Runtime → Runtime Settings → Schedules. From then on the workflow starts by itself at each fire time, with no process or caller involved.Schedules are available on Output Focused workflows. A workflow can have up to 50 schedules, and each one needs a name that is unique on that workflow.
1
Add a schedule
Open the Start node, expand Schedules, and click Add schedule. Click the new schedule card to open the Schedule Workflow dialog, and give the schedule a Name.
2
Set when it fires
Choose a Timer Type:
Date fires once, at the Fire at date and time, entered in your local time.
Cycle fires repeatedly. Pick a Format, ISO or Cron, then build the expression with Guided fields or type it under Expression.
The dialog previews the next fire times in your local time zone. Check them, then click Save.
3
Activate the schedule
Go to Runtime → Runtime Settings → Schedules, filter Origin by Workflow, and click Activate on the schedule. The workflow must be part of the project’s active build.
Saving a schedule or publishing a build never activates it. A schedule fires only after you activate it on the Schedules page.
Which cycle format should I use?
Format
How it fires
Example
Rules
ISO
Repeats an ISO 8601 interval a set number of times, or indefinitely
R5/P1D: five times, once a day
The interval must be longer than zero, in whole seconds. A Start Time, if you set one, must be in the future.
Cron
Fires on a six-field cron schedule: second, minute, hour, day of month, month, day of week
0 */5 * * * ?: every five minutes
Cron is read in UTC. Set an Active window with a Start and an End: the schedule fires only between them. Macros such as @daily and @hourly also work.
What does a scheduled run receive? A scheduled run doesn’t use the Start node’s test payload. Its input holds three fields that you can map like any other input:
Field
Contents
firedAt
When the run actually started, as an ISO 8601 timestamp
scheduledFor
When the schedule was due, as an ISO 8601 timestamp
triggerName
The name of the schedule that started the run
Where do scheduled runs show up? In Workflow Instances, with the origin Schedule. The run details name the schedule that started it.How do I stop a schedule? To pause it, click Deactivate on the Schedules page, and click Activate to resume it. To remove it for good, delete it from its card on the Start node. A deleted schedule stops firing immediately, and the deletion can’t be undone.
Enables communication with external systems via REST API calls. Supports GET, POST, PUT, PATCH, and DELETE methods. Endpoints are selected from a dropdown, grouped by system.
Params: Configure path, query, and header parameters.
Input/Output: Input is auto-populated from the previous node; output displays the API response.
You can test REST API Call nodes independently to validate connections and data retrieval.
When does a REST API Call node take its failure exit?
A REST API Call node has a success exit and a failure exit. It takes the success exit only for a 2xx response without errors. Everything else takes the failure exit:
a non-2xx response;
a timeout, stored as status 408 with data.timeout: true (set the limit with Timeout on the node’s Settings tab, default 10000 ms);
a connection error;
a response body declared as JSON or XML that can’t be parsed.
With Allow Retry on, a 408, 429, 500, 502, 503, or 504 is retried first, and the node takes the failure exit only once the retries are used up.
If the call fails and the failure exit isn’t connected, the workflow instance fails with Workflow is missing outgoing sequence. It doesn’t fall through to the success exit.
On both exits the node writes its result under its response key: data (the parsed body), metadata (statusCode and headers), hasError and errorMessage. hasError only flags connection and parsing errors: a 4xx or 5xx with a readable body has hasError: false even though the node took the failure exit, and on a timeout it isn’t set. To branch on the outcome, use the exits or metadata.statusCode, not hasError.Errors while building the request, such as a failed input mapping or a missing endpoint, don’t use the failure exit. They fail the workflow instance.
Evaluates logical conditions (JavaScript or Python) to direct workflow execution along different branches.
If/Else: Routes based on condition evaluation.
One branch per run: The node follows the first branch whose condition passes, or the Else branch. To run branches at the same time, use the Start Parallel and End Parallel nodes.
Use fork nodes to implement business rules, error handling, or multi-path logic.
// Route based on user identityadditionalData.securityDetails.username === 'admin@company.com'// Route based on configuration parameteradditionalData.applicationConfiguration.featureEnabled === true// Combine input data with config parametersinput.amount > additionalData.applicationConfiguration.approvalThreshold// Check user and input togetherinput.priority === 'high' && additionalData.securityDetails.details.email.endsWith('@company.com')
# Route based on user identityadditionalData["securityDetails"]["username"] == "admin@company.com"# Route based on configuration parameteradditionalData["applicationConfiguration"]["featureEnabled"] == True# Combine input data with config parametersinput["amount"] > additionalData["applicationConfiguration"]["approvalThreshold"]# Check user and input togetherinput["priority"] == "high" and additionalData["securityDetails"]["details"]["email"].endswith("@company.com")
Available on SaaS with FlowX.AI 5.11. This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.
Condition expressions can call the reusable functions defined in your project, so branch routing can reuse the same business logic as your processes. Call a function inside a condition using the standard syntax:
JavaScript
Python
// Route on the result of a reusable functionfunctions.lending.isEligible(input.applicant) === true
# Route on the result of a reusable functionfunctions.lending.isEligible(input["applicant"]) == True
Each branch condition can call functions, and the node resolves the functions referenced across all of its branches together. Resolution follows the same rules as the Script node: calls resolve from the workflow’s build, a function that calls another function resolves its full call chain, and cross-app calls are matched by app name.
As with Script nodes, reusable functions resolve only in a build context. A draft or test run with no build resolves no functions.
Run several steps of a workflow at the same time with a pair of nodes: Start Parallel splits the flow into branches that all run at once, and End Parallel waits for every branch, merges what the branches wrote, and continues. In the node palette they sit under Flow Control as Start Parallel Path and End Parallel Path. Dropped on the canvas, they are named Start Parallel and End Parallel.These nodes are the only way to run branches concurrently. A Condition (Fork) node evaluates its conditions and follows one branch.
Drag Start Parallel Path from the Flow Control group onto the canvas and connect the previous node to it.
2
Create one sequence per branch
Draw a sequence from the Start Parallel node to the first node of each branch. Every outgoing sequence is a branch. A branch needs at least one node: the Designer does not let you connect a Start Parallel node straight to an End Parallel or End Flow node.
3
Build each branch
Add the nodes each branch needs: REST endpoints, scripts, FlowX Database operations, AI nodes, subworkflows, or another Start Parallel node for nested branches.
4
Close every branch on the same End Parallel node
Connect the last node of every branch to one End Parallel Path node, then connect that node to whatever comes next. An End Parallel node allows a single outgoing sequence.
At runtime all branches run concurrently. The End Parallel node completes when the slowest branch reaches it, so the branch section takes as long as its longest branch, not the sum of the branches.
Each branch starts with a deep copy of the workflow data as it was when the Start Parallel node ran. Branches work on independent copies: a branch cannot read what another branch writes while they run.
When a branch reaches the End Parallel node, the keys that branch wrote are merged into the parent data with a recursive deep merge, in the order the branches finish:
Keys written by only one branch are kept.
A key written by two branches ends up with the value from the branch that finished last.
Nested objects are merged key by key, so only the conflicting leaf values are overwritten.
Arrays and all other non-object values are replaced whole. There is no element-level merge, so two branches cannot each fill a different element of the same array.
Because the merge order depends on which branch finishes last, two branches that write the same key give a non-deterministic result.
Have each branch write to its own key, for example apiResultA, apiResultB and apiResultC, and combine them in a Script node after the End Parallel node.
A node that fails inside a branch follows the same rules as anywhere else in the workflow. If its failure exit is connected, the branch continues on that path and must still reach the End Parallel node. If the failure exit is not connected, the workflow instance fails.
When the instance fails, the other branches stop at the next node they reach. Nothing they already executed is rolled back.
If the branches of one Start Parallel node end on different End Parallel nodes, or one End Parallel node receives branches from two different Start Parallel nodes, the run fails with Missing end parallel gateway and the cause Parallel branches merge failed: missing or incompatible end parallel node.
A Start Parallel node with no outgoing sequence fails the run with Workflow is missing outgoing sequences.
Same End Parallel node for all branches: every branch of a Start Parallel node must end on the same End Parallel node, and that node allows one outgoing sequence.
Last-write-wins merge: write to distinct keys per branch and combine them in a Script node afterwards.
No element-level array merge: you cannot process the first element of an array in one branch and the second in another.
No cross-branch reads: branches run on independent data copies and cannot see each other’s writes until the merge.
Nesting is allowed: a branch can contain its own Start Parallel and End Parallel pair.
Executes custom JavaScript or Python code to transform, map, or enrich data between nodes.The node’s output is merged into the workflow data, the same way business rule output is merged into process data: keys the script doesn’t write keep their values, and writing {} to an existing object changes nothing. To clear a key, set it to null. For the full merge rules, see How output is merged into process data.
Available on SaaS with FlowX.AI 5.11. This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.
A Script node can call the reusable functions defined in your project, the same way a process Business Rule action does. Write the call directly in the node’s code using the standard syntax:
functions.projectName.functionName(input.params)
The Designer reads the function calls from your script and links the node to those functions automatically, so there is no separate step to register a reference. The linked functions also appear on each function’s Usages tab, and removing the node clears those usage entries. Function calls resolve from the app version that the workflow runs in, and a function that calls another function resolves its full call chain. Functions defined in a different app are matched by their app name, so cross-app calls work the same way they do in processes.
Reusable functions resolve only in a build context. The Script node’s Test modal resolves them when you run it against a selected build; a draft or preview run with no build in context resolves no functions, so calls to functions.* return no result until a build is selected.
A Script node ships with a Test modal that lets you exercise the script against sample input without running the full workflow. Open it with the expand icon at the top-right corner of the code editor, next to the expand/collapse chevron.The modal has three side-by-side panels:
Panel
Purpose
Input
JSON input passed to the script. Load from a past individual node run or from a past workflow run via the input selector.
Code
The script body. Inline warnings are surfaced as you type. Includes Save and Test buttons.
Output
The JSON returned by the script after running Test. Runtime errors are shown here.
The Test button runs the current contents of the Code panel, even if you have not clicked Save yet. Use this to iterate on a fix without committing changes to the Script node.
Runs triggered from the Test modal are excluded from the Console log History panel, because they may be running unsaved code.
The Logs tab of a workflow run displays the node run instance ID alongside the workflow instance ID for each Script node execution. A copy button is rendered next to every instance ID. Use this to grab a node-run identifier and paste it into the Test modal’s input selector to replay the exact past run.
The Subworkflow node allows you to modularize complex workflows by invoking other workflows as reusable subcomponents. This approach simplifies process design, promotes reuse, and simplifies maintenance.
1
Add a Subworkflow Node
Select Start Subworkflow from the Select Next Node dropdown. Choose from workflows categorized as Local or Libraries.
2
Configure the Subworkflow Node
Workflow Selection: Pick the workflow to invoke.
Open: Edit the subworkflow in a new tab.
Preview: View the workflow canvas in a popup.
Response Key: Set a key (e.g., response_key) for output.
Available on SaaS with FlowX.AI 5.11. This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.
By default, a Subworkflow node forwards the whole parent context to the subworkflow and nests the result under the response key. Data mapping lets you instead pass only selected fields into the subworkflow and land its results directly into named parent variables, using visual input and output mappers rather than raw JSON.In the node config panel, expand Data mapping and turn Enable data mapping on.
When data mapping is off, the node keeps its original behavior: the Input and read-only Output JSON fields described above. Turning Enable data mapping on replaces those with the mappers below.
When data mapping is on, the node exposes two mappers, driven by the subworkflow’s own start and end nodes:
Mapper
Helper text
Defined per
How it is labeled
Input mapping
Variables sent by the main workflow
The subworkflow start node
A single row labeled Start
Output mapping
Variables received by the main workflow
Each subworkflow end node
One row per end node, labeled with the end node’s name
Output mapping applies only to synchronous subworkflows. If the subworkflow runs asynchronously, the parent does not wait for a result, so the Output mapping block is hidden.
Each row opens a mapper modal. Use it to draw field-to-field mappings between the data models, then check the result before saving.
1
Open the mapper
Click the edit icon on the Start row (input) or on an end-node row (output).
2
Map fields between the two data models
The modal shows the source data model on the left and the target data model in the middle. Each side is color-coded: Project Data Model and Workflow Data Model. Draw the field-to-field mappings, or define static values and expression scripts where a direct field match does not exist.
3
Test the mapping
Click Test to run the current mappings and preview the produced payload in the read-only results panel on the right. Any mapping errors are highlighted so you can correct them before saving.
4
Apply values from a past run (optional)
To test against real data, pick a previous workflow instance from Past Instances Variables and click Apply to load that instance’s values as the source example. Use the reset control to return to the default example values.
5
Save
Click Save to store the mapping on the node. In committed or upper environments the modal is read-only and shows Close instead.
Data mapping keeps the subworkflow’s contract explicit: the parent passes exactly the fields the subworkflow needs, and only the mapped results flow back. This is easier to maintain than forwarding the entire context and reading everything back through the response key.
Import, export, and cloneSubworkflow mappings are stored as part of the workflow definition, so they travel with the node when the workflow is exported, imported, or cloned.
On upgrade, existing Subworkflow nodes keep data mapping turned off, so they continue to behave exactly as before. Turn Enable data mapping on per node to adopt the mappers.
Use subworkflows for reusable logic such as data enrichment, validation, or external system calls.
Available on SaaS with FlowX.AI 5.12. This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.
A Subworkflow node normally runs the child workflow once. Turn on Parallel Multi-Instance to run it once for every element of an array instead, in parallel, and collect the results back into a second array.This keeps fan-out inside the Integration Designer. Previously, running a workflow once per item meant wrapping it in a process and fanning out with a multi-instance Call Activity.In the node config panel, expand Execution and turn Parallel Multi-Instance on.
Turning Parallel Multi-Instance on also turns Enable Data Mapping on and locks it there, because each array element has to be mapped into the child workflow individually. The data mapping mappers stay available and work the same way.
Then set the two arrays:
Setting
Where
Required
What it does
Input Array
Input Mapping
Yes
The array of objects to iterate. One subworkflow instance starts per element.
Output Array
Output Mapping
Yes
The array each instance’s result is collected into.
Correlation attribute
Output Mapping
No
Decides which output array element each result updates.
Only array attributes from the workflow data model can be selected, and both arrays must be arrays of objects. If a dropdown offers nothing, the workflow data model has no array attributes to choose from.
How results landThe correlation attribute behaves as an upsert key rather than a strict join:
A result whose correlation value matches an existing element of the output array updates that element.
A result that matches no element is appended.
With no correlation attribute set, every result is appended.
Correlation candidates are the primitive fields of the output array’s element, so pick the output array first. Until you do, the Correlation attribute selector stays empty.If the merge fails, the still-running instances are cancelled and the output array is emptied. See Routing a subworkflow failure.
Point the input and output arrays at different data model attributes. Reusing one array as both the source and the target makes the upsert behavior hard to reason about.Each instance runs the same subworkflow against one element, so if you need per-element branching, put it inside the child workflow rather than around the Subworkflow node.
Parallel multi-instance is not the same as parallel branches. Start Parallel and End Parallel nodes run several different branches of one workflow at the same time. Parallel multi-instance runs one subworkflow many times, once per element of an array. Use parallel branches for different work in parallel, and multi-instance for the same work over a collection.
Parent workflow waits for subworkflow completion before proceeding.
If the subworkflow fails, the parent workflow halts at this node. On SaaS (5.12), connecting the node’s failure exit routes the failure down its own branch instead. See Routing a subworkflow failure.
Subworkflow output is available to downstream nodes via the response key.
Logs include workflow name, instance ID, and node statuses for both parent and subworkflow.
If a subworkflow is deleted, an error displays: [name] subworkflow not found.
Subworkflow runs are recorded in workflow instance history for traceability.
Available on SaaS with FlowX.AI 5.12. This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.
A Subworkflow node has two exits, drawn as a green connector for success and a red one for failure. Connect the red exit to send a failed run down its own branch instead of stopping the parent workflow.This is opt-in per node. A node whose red exit is not connected fails and blocks exactly as it did before, and nothing is changed for existing workflows.Only a mapping failure is routed, because that is the kind of failure a workflow can be built to handle: the same workflow succeeds for records that carry the right fields.
Routed down the failure exit
Still stops the workflow
The input mapper fails
No subworkflow is set on the node
The input it produced does not satisfy what the subworkflow expects
The response key is missing
The output mapper fails when merging the result back
The node has no mapping configured at all
The run hits the maximum node or subworkflow-depth limit
On the failure branch, the node writes a fixed subWorkflowError key, separate from its response key:
Field
Description
hasError
Always true. It exists so a branch reads the same shape here as on other node types.
errorMessage
For example, The input of subworkflow node [name] could not be mapped, so no subworkflow was started.
errorType
INPUT_MAPPING or OUTPUT_MAPPING, so a branch can tell a child that never started from one that ran and could not be merged back.
childInstanceUuid
The run whose result could not be mapped back. Left out entirely when no child was started.
The failure exit covers the node’s own mapping. A subworkflow that fails inside itself still cascades to the parent, whether or not the failure exit is connected.A manual single-node run also reports the error to you rather than following the branch.
On a parallel multi-instance node, a merge failure cancels the sibling instances that are still running and empties the output array before taking the failure branch, so the branch never reads a half-filled list.
The End node signifies the termination of a workflow’s execution. It collects the final output and completes the workflow process.
Receives input in JSON format from the previous node.
Output represents the final data model of the workflow.
Multiple End nodes are allowed for different execution paths.
If the node’s output doesn’t meet mandatory requirements, it will be flagged as an error to ensure all necessary data is included. Output parameters declared in the workflow’s output schema are a runtime contract: when any of them resolves to no value, the run fails with The mandatory output parameters of the <workflow> workflow are missing at runtime - see the error glossary.
A placeholder that doesn’t resolve fails silently on an End node: the output field is set to null, and the only error you see is the mandatory-output failure above. When mapping an End node output:
Use the bare key with no prefix: ${responseKey.data}, not ${output.value} or ${input.responseKey.data}.
Check the spelling against the Response Key configured on the REST node - the response body lives under <responseKey>.data.
Leave the placeholder unquoted for numeric or boolean values; quote it ("${key}") only for strings.
To confirm what an End node actually produced, open the node in the workflow run details: it shows the exact input it received and the output JSON it emitted.
Last modified on November 2, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"FlowX.AI","description":"Comprehensive documentation for FlowX.AI, the AI-driven process automation platform.","colors":{"primary":"#fcb813","light":"#fcb813","dark":"#fcb813"},"logo":{"light":"https://mintcdn.com/flowxai/38fXEM0a7v86Lg2m/logo/light.png?fit=max\u0026auto=format\u0026n=38fXEM0a7v86Lg2m\u0026q=85\u0026s=d767c06cef433b0a02f40a1f4f785eab","dark":"https://mintcdn.com/flowxai/38fXEM0a7v86Lg2m/logo/dark.png?fit=max\u0026auto=format\u0026n=38fXEM0a7v86Lg2m\u0026q=85\u0026s=6b8b8c3e7abd17acf6be8bffce4e599d"},"favicon":"https://mintcdn.com/flowxai/VVxnbzjz7JuL1Ngt/favicon2.svg?fit=max\u0026auto=format\u0026n=VVxnbzjz7JuL1Ngt\u0026q=85\u0026s=ef6a780a1ed3894c7b276bcc7b3c6c69","appearance":{"default":"dark","strict":false},"background":{"decoration":"grid","color":{"light":"#f4f4f5","dark":"#0a0b0d"}},"navbar":{"links":[],"primary":{"type":"button","label":"Academy","href":"https://academy.flowx.ai/"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/flowxai","x":"https://x.com/FlowX_ai","youtube":"https://www.youtube.com/@FlowX_AI"},"links":[{"header":"Documentation","items":[{"label":"Introduction","href":"https://docs.flowx.ai/5.9/docs/introduction"},{"label":"Platform overview","href":"https://docs.flowx.ai/5.9/docs/platform-overview/flowx-architecture"},{"label":"Designer","href":"https://docs.flowx.ai/5.9/docs/flowx-designer/overview"},{"label":"AI Platform","href":"https://docs.flowx.ai/5.9/ai-platform/ai-in-flowx"},{"label":"Use the docs with AI","href":"https://docs.flowx.ai/5.9/docs/getting-started/using-flowx-docs-with-ai"},{"label":"Release notes","href":"https://docs.flowx.ai/release-notes/overview"}]},{"header":"Resources","items":[{"label":"FlowX.AI Academy","href":"https://academy.flowx.ai"},{"label":"Support","href":"https://flowxai.zendesk.com/"}]},{"header":"Company","items":[{"label":"About FlowX.AI","href":"https://www.flowx.ai/about"},{"label":"Contact us","href":"mailto:hello@flowx.ai"},{"label":"Careers","href":"https://apply.workable.com/flowxai"}]},{"header":"Legal","items":[{"label":"Privacy Policy","href":"https://www.flowx.ai/privacy-policy"},{"label":"Cookie Policy","href":"https://www.flowx.ai/cookie-policy"},{"label":"Terms and Conditions","href":"https://www.flowx.ai/terms-and-conditions"}]}]},"search":{"prompt":"Search the docs"},"seo":{"metatags":{"zd-site-verification":"94tteg5ir5of8gkb4twzh"}},"fonts":{"heading":{"family":"Sora"},"body":{"family":"Geist"}},"styling":{"eyebrows":"breadcrumbs","codeblocks":"dark","latex":true},"integrations":{"ga4":{"measurementId":"G-CGW0FVK9YM"}},"banner":{"content":"🚀 [See the latest FlowX.AI releases →](/release-notes/overview)","dismissible":true},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"flowxai","hasAudioNarration":false,"actualSubdomain":"flowxai","customDomains":["docs.flowx.ai"],"gitSource":{"type":"github","owner":"flowx-ai","repo":"flowx-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae8c80172371a1bd635112c","collectionId":"a38ca03f-344d-46c3-b4e4-769035be5946","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae8c80172371a1bd635112c"},"feedback":{"thumbs":true,"contextualFeedback":{"allowEmail":true},"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae8c80172371a1bd635112c","clientVersion":"0.0.4044","searchFilterCounts":[{"language":"default","tag":"Documentation","count":797},{"language":"default","tag":"Building blocks","count":329},{"language":"default","tag":"Platform deep dive","count":267},{"language":"default","tag":"Setup guides","count":191},{"language":"default","tag":"UI Designer","count":140},{"language":"default","tag":"Release notes","count":137},{"language":"default","tag":"Release Notes","count":137},{"language":"default","tag":"Microservices","count":112},{"language":"default","tag":"Core extensions","count":107},{"language":"default","tag":"Nodes","count":88}],"searchSettings":{"isFiltersEnabled":true}},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"type":"email","email":"learning.team@flowx.ai","showHelpButton":true}},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"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":"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":"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":"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":"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":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","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":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","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},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"privacy":{"consentBanner":{"enabled":true}},"googleFontsInlined":true},"customCss":[{"filePath":"custom.css","content":"/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 400;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 500;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n/* cyrillic-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrodmgPn.woff2) format('woff2');\n unicode-range: U+0460-052F, U+1C80-1C8A, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;\n}\n/* cyrillic */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrMdmgPn.woff2) format('woff2');\n unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;\n}\n/* symbols2 */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFg08vz7ehw.woff2) format('woff2');\n unicode-range: U+2000-2001, U+2004-2008, U+200A, U+23B8-23BD, U+2500-259F;\n}\n/* vietnamese */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrgdmgPn.woff2) format('woff2');\n unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;\n}\n/* latin-ext */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrkdmgPn.woff2) format('woff2');\n unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C4, U+2113, U+2C60-2C7F, U+A720-A7FF;\n}\n/* latin */\n@font-face {\n font-family: 'Geist Mono';\n font-style: normal;\n font-weight: 600;\n font-display: swap;\n src: url(/_mintlify/assets/fonts/google/s/geistmono/v6/or3nQ6H-1_WfwkMZI_qYFrcdmg.woff2) format('woff2');\n unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;\n}\n@keyframes fxh-tick-pulse{0%,to{opacity:1}50%{opacity:.35}}@keyframes fxh-caret-blink{50%{opacity:0}}@keyframes fxh-ln-in{to{opacity:1;transform:none}}@keyframes fxh-rv-in{to{opacity:1;transform:none}}@keyframes fxl-stack-ride{0%{top:0;opacity:0}4%{opacity:1}52%{top:calc(100% - 7px);opacity:1}58%,to{top:calc(100% - 7px);opacity:0}}@keyframes fxl-stack-lit{0%,2%,30%,to{color:var(--fxl-faint)}18%,6%{color:var(--fxl-text)}}@keyframes fxl-stack-tick{0%,2%,30%,to{background:var(--fxl-line)}18%,6%{background:#fcb813}}code,kbd,pre,samp{font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace}#topbar-cta-button{color:#131007!important}.label-version{display:inline-block;font-weight:700;color:#fff;background-color:#007bff;padding:.5px 15px;border-radius:12px;box-shadow:0 2px 4px rgba(0,0,0,.1);font-size:.9em;text-transform:uppercase;letter-spacing:.5px;margin-right:5px;transition:background-color .3s ease;text-decoration:none}.label-version:hover{background-color:#0056b3}#banner{background:linear-gradient(90deg,#0a0b0d 0,#0e1013 55%,#2a2310 100%)!important;border-bottom:1px solid rgba(252,184,19,.3);backdrop-filter:saturate(120%)}#banner a{color:#fcb813!important;text-decoration-color:rgba(252,184,19,.55)!important;transition:opacity .2s ease}#banner a:hover{opacity:.85}:root{--flowx-yellow-50:#fff8e7;--flowx-yellow-200:#ffdf92;--flowx-yellow-400:#ffc739;--flowx-yellow-500:#fcb813;--flowx-yellow-800:#8a5e00;--flowx-yellow-900:#6b4e08;--flowx-neutrals-50:#f7f8f9;--flowx-neutrals-100:#e3e8ed;--flowx-neutrals-200:#cbd1db;--flowx-neutrals-300:#a6b0be;--flowx-neutrals-400:#8390a2;--flowx-neutrals-500:#64748b;--flowx-neutrals-700:#475263;--flowx-neutrals-800:#2a313a;--flowx-neutrals-900:#1d232c;--flowx-blue-50:#e6f0fb;--flowx-blue-200:#8abbed;--flowx-blue-700:#004c99;--flowx-blue-900:#002d5b;--flowx-elevation-m:0 8px 16px #1634621a}.cb-wrap{margin-top:32px}.cb-filters{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px}.cb-filters input{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.cb-filters label{cursor:pointer;user-select:none;font-size:12px;line-height:16px;font-weight:600;padding:8px 16px;border-radius:120px;border:1px solid var(--flowx-neutrals-200);color:var(--flowx-neutrals-500);background:0 0;transition:border-color .15s ease,background .15s ease,color .15s ease}.cb-filters label span{margin-left:6px;opacity:.55;font-variant-numeric:tabular-nums}.cb-filters label:hover{border-color:var(--flowx-yellow-500);color:var(--flowx-neutrals-900)}.cb-filters input:checked+label,.dark .cb-filters input:checked+label{background:var(--flowx-yellow-500);border-color:var(--flowx-yellow-500);color:var(--flowx-neutrals-900)}.cb-filters input:focus-visible+label{outline:2px solid var(--flowx-yellow-500);outline-offset:2px}.dark .cb-filters label{border-color:var(--flowx-neutrals-700);color:var(--flowx-neutrals-400)}.dark .cb-filters label:hover{border-color:var(--flowx-yellow-400);color:var(--flowx-neutrals-50)}.cb-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}@media (max-width:1024px){.cb-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:640px){.cb-grid{grid-template-columns:1fr}}.cb-wrap:has(#cb-conv:checked) .cb-card:not([data-f~=conversational]),.cb-wrap:has(#cb-cookbook:checked) .cb-card:not([data-f~=cookbook]),.cb-wrap:has(#cb-docs:checked) .cb-card:not([data-f~=docs]),.cb-wrap:has(#cb-guide:checked) .cb-card:not([data-f~=guide]),.cb-wrap:has(#cb-integr:checked) .cb-card:not([data-f~=integrations]),.cb-wrap:has(#cb-pattern:checked) .cb-card:not([data-f~=pattern]),.cb-wrap:has(#cb-tutorial:checked) .cb-card:not([data-f~=tutorial]),.cb-wrap:has(#cb-ui:checked) .cb-card:not([data-f~=ui]){display:none}.cb-card{position:relative;display:flex;flex-direction:column;gap:12px;padding:24px;border:1px solid var(--flowx-neutrals-100);border-radius:16px;background:0 0;text-decoration:none!important;transition:border-color .2s ease,transform .2s ease,box-shadow .2s ease}.cb-card::after{content:\"\\2192\";position:absolute;top:20px;right:24px;font-size:14px;line-height:22px;color:var(--flowx-neutrals-300);transition:color .2s ease,transform .2s ease}.cb-card:hover{transform:translateY(-2px);border-color:var(--flowx-yellow-500);box-shadow:var(--flowx-elevation-m)}.cb-card:hover::after{color:var(--flowx-neutrals-900);transform:translateX(4px)}.dark .cb-card{border-color:var(--flowx-neutrals-800)}.dark .cb-card:hover{border-color:var(--flowx-yellow-400);box-shadow:0 8px 16px rgba(0,0,0,.4)}.dark .cb-card:hover::after,.dark .cb-foot a:hover{color:var(--flowx-yellow-400)}@media (prefers-reduced-motion:reduce){.cb-card,.cb-card::after{transition:none}.cb-card:hover,.cb-card:hover::after{transform:none}}.cb-tags{display:flex;flex-wrap:wrap;gap:6px;padding-right:24px}.cb-tag{font-size:10px;line-height:12px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;padding:4px 8px;border-radius:4px;background:var(--flowx-neutrals-50);color:var(--flowx-neutrals-500)}.cb-tag-tut{background:var(--flowx-yellow-50);color:var(--flowx-yellow-800)}.cb-tag-pat{background:var(--flowx-neutrals-900);color:#fff}.cb-tag-cook{background:var(--flowx-yellow-500);color:var(--flowx-neutrals-900)}.cb-tag-gui{background:var(--flowx-blue-50);color:var(--flowx-blue-700)}.dark .cb-tag{background:var(--flowx-neutrals-800);color:var(--flowx-neutrals-400)}.dark .cb-tag-tut{background:var(--flowx-yellow-900);color:var(--flowx-yellow-200)}.dark .cb-tag-pat{background:var(--flowx-neutrals-50);color:var(--flowx-neutrals-900)}.dark .cb-tag-cook{background:var(--flowx-yellow-500);color:var(--flowx-neutrals-900)}.dark .cb-tag-gui{background:var(--flowx-blue-900);color:var(--flowx-blue-200)}.cb-foot a,.cb-title{font-weight:600;color:var(--flowx-neutrals-900)}.cb-title{display:block;font-size:14px;line-height:22px;letter-spacing:-.01em}.dark .cb-foot a,.dark .cb-title{color:var(--flowx-neutrals-50)}.cb-desc{display:block;font-size:12px;line-height:18px;font-weight:400;color:var(--flowx-neutrals-500)}.cb-foot span,.dark .cb-desc{color:var(--flowx-neutrals-400)}.cb-foot{display:flex;flex-wrap:wrap;align-items:baseline;gap:16px;margin-top:40px;padding-top:24px;border-top:1px solid var(--flowx-neutrals-100);font-size:12px;line-height:16px}.dark .cb-foot{border-top-color:var(--flowx-neutrals-800)}.dark .cb-foot span{color:var(--flowx-neutrals-500)}.cb-foot a{text-decoration:none;border-bottom:1px solid var(--flowx-yellow-500);padding-bottom:1px}.cb-foot a:hover{color:var(--flowx-yellow-800)}#content-area:has(.fxh-hero) #header{display:none}main#content-container:has(.fxh-hero){max-width:none}#content-area:has(.fxh-hero){width:100%!important}#content-area:has(.fxh-hero) #content{max-width:none;margin-top:0}#content-area:has(.fxh-hero) #content div[class*=\"--page-padding\"]{--page-padding:0px}#content-area:has(.fxh-hero) #content>:not(.fxh-hero){max-width:1360px;margin-left:auto;margin-right:auto}.fxh-hero{position:relative;text-align:center}@media (min-width:1024px){.fxh-hero{margin-top:-2.5rem}}.fxh-hero__bg{position:sticky;top:0;z-index:0;height:100dvh;overflow:clip;border-radius:18px;background:#0a0b0d;border:1px solid rgba(255,255,255,.08)}.fxh-hero__bg::after,.fxh-hero__bg::before{content:\"\";position:absolute;pointer-events:none}.fxh-hero__bg::before{inset:0;background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);background-size:56px 56px;-webkit-mask-image:radial-gradient(ellipse at 50% 0,#000 25%,transparent 75%);mask-image:radial-gradient(ellipse at 50% 0,#000 25%,transparent 75%)}.fxh-hero__bg::after{top:-45%;left:25%;width:50%;height:90%;background:radial-gradient(closest-side,rgba(252,184,19,.1),transparent 70%)}.fxh-hero__steps{position:relative;z-index:1;margin-top:-100dvh}.fxh-hero__step{position:relative;min-height:calc(100dvh - 9.5rem);display:grid;grid-template-columns:minmax(0,1fr);align-content:center;padding:48px clamp(24px,5vw,56px) 96px}.fxh-hero__step:not(:first-child){min-height:72dvh;padding-top:48px;padding-bottom:48px}.fxh-hero--single .fxh-hero__bg{position:absolute;inset:0;height:auto;z-index:0}.fxh-hero--single .fxh-hero__steps{margin-top:0}.fxh-hero--single .fxh-hero__step{min-height:calc(100dvh - 9.5rem)}.fxh-hero--slim .fxh-hero__step{min-height:min(46dvh,480px);padding-top:clamp(40px,6vh,64px);padding-bottom:clamp(40px,6vh,64px)}.fxh-step-title{display:block;font-family:\"Sora\",sans-serif;font-size:clamp(1.7rem,3.4vw,2.6rem);font-weight:700;letter-spacing:-.02em;line-height:1.1;color:#f5f5f0;max-width:20ch;margin:0 auto clamp(18px,3vh,28px)}.fxh-vs{display:flex;flex-wrap:wrap;justify-content:center;gap:clamp(9px,1.1vw,14px);max-width:min(780px,100%);margin:clamp(14px,3vh,30px) auto 0;padding:0;list-style:none}.fxh-vs li{display:flex;align-items:center;gap:12px;padding:11px clamp(18px,1.6vw,24px);border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.035);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-radius:999px}.fxh-vs__no{font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:rgba(255,255,255,.42)}.fxh-vs__name{font-family:\"Sora\",sans-serif;font-size:clamp(12.5px,1.1vw,15px);font-weight:600;letter-spacing:.01em;color:rgba(255,255,255,.9)}.fxh-scroll{position:absolute;bottom:clamp(20px,4vh,40px);left:50%;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:8px;font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10px;letter-spacing:.3em;text-transform:uppercase;color:rgba(255,255,255,.42)}.fxh-scroll-line{width:1px;height:46px;background:linear-gradient(rgba(255,255,255,.45),transparent)}.fxh-eyebrow{font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;display:inline-flex;align-items:center;gap:12px;font-size:13px;font-weight:400;letter-spacing:.22em;text-transform:uppercase;color:#a3a39a;margin-bottom:28px}.fxh-tick{display:inline-block;width:8px;height:8px;flex-shrink:0;background:#fcb813;animation:fxh-tick-pulse 2.6s ease-in-out infinite}.fxh-title{display:block;font-family:\"Sora\",sans-serif;font-weight:700;letter-spacing:-.02em;line-height:1.08;max-width:920px;margin:0 auto clamp(20px,3vh,28px);text-wrap:balance}.fxh-line{display:block;font-size:clamp(1.7rem,3.4vw,2.7rem);color:#f5f5f0}.fxh-line--dim{color:rgba(244,245,243,.58);margin-top:.06em}.fxh-amber{color:#fcb813}.fxh-sub{display:block;max-width:62ch;margin:0 auto clamp(20px,3vh,28px);font-size:15px;line-height:1.55;color:#b9b9b1}.fxh-cta,.fxh-ctas{justify-content:center}.fxh-ctas{display:flex;flex-wrap:wrap;gap:12px;position:relative}.fxh-cta{display:inline-flex;align-items:center;gap:8px;white-space:nowrap;padding:12px 22px;border-radius:10px;font-size:15px;font-weight:550;text-decoration:none!important;transition:background .2s ease,border-color .2s ease,color .2s ease}.fxh-cta--primary{background:#fcb813;color:#131007!important;font-weight:640}.fxh-cta--primary:hover{background:#ffc739}.fxh-cta--ghost{border:1px solid rgba(255,255,255,.16);color:#f4f5f3!important}.fxh-cta--ghost:hover{border-color:rgba(255,255,255,.42);background:rgba(255,255,255,.04)}.fxh-term,.fxh-term__dots i{border:1px solid rgba(255,255,255,.12)}.fxh-term{position:relative;width:min(680px,100%);margin:clamp(24px,4vh,36px) auto clamp(22px,3.5vh,32px);text-align:left;border-radius:18px;overflow:hidden;background:linear-gradient(180deg,rgba(255,255,255,.1) 0,rgba(255,255,255,.03) 20%,rgba(255,255,255,.01) 60%,rgba(255,255,255,.045) 100%),rgba(10,11,13,.91);box-shadow:0 24px 60px rgba(0,0,0,.5)}.fxh-term__bar{display:flex;align-items:center;gap:16px;padding:14px 22px;font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;letter-spacing:.06em;color:rgba(255,255,255,.62);border-bottom:1px solid rgba(255,255,255,.12)}.fxh-term__dots{display:inline-flex;gap:7px}.fxh-term__dots i{width:11px;height:11px;border-radius:50%}.fxh-term__body{display:flex;flex-direction:column;gap:14px;padding:24px 26px 26px;font-family:\"Geist Mono\",ui-monospace,SFMono-Regular,Menlo,monospace;font-size:14px}.fxh-term__body p{margin:0;color:rgba(255,255,255,.72)}.fxh-term__prompt{color:#fcb813;margin-right:8px}.fxh-caret{display:inline-block;width:9px;height:1.05em;margin-left:6px;vertical-align:text-bottom;background:rgba(252,184,19,.85);animation:fxh-caret-blink 1.1s steps(1) infinite}.fxh-term__log{display:grid;gap:5px;align-content:start}.fxh-term__log:empty{display:none}.fxh-term__log .ln{display:flex;justify-content:space-between;gap:16px;font-size:12.5px;color:rgba(255,255,255,.58);opacity:0;transform:translateY(6px);animation:fxh-ln-in .45s cubic-bezier(.16,1,.3,1) forwards}.fxh-term__log .ok{color:#fcb813;margin-right:8px}.fxh-term__log .t,.fxh-term__ver{color:rgba(255,255,255,.34)}.fxh-term__ver{margin-left:auto}.fxh-field{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;opacity:.55}#footer a[href*=\"utm_campaign=poweredBy\"],.fxh-hero--live .fxh-hero__bg::before{display:none}.fxh-hero--live .fxh-hero__step:first-child .fxh-ctas,.fxh-hero--live .fxh-hero__step:first-child .fxh-eyebrow,.fxh-hero--live .fxh-hero__step:first-child .fxh-scroll,.fxh-hero--live .fxh-hero__step:first-child .fxh-sub,.fxh-hero--live .fxh-hero__step:first-child .fxh-title{opacity:0;transform:translateY(26px);animation:fxh-rv-in .9s cubic-bezier(.16,1,.3,1) forwards}.fxh-hero--live .fxh-hero__step:first-child .fxh-eyebrow{animation-delay:.15s}.fxh-hero--live .fxh-hero__step:first-child .fxh-title{animation-delay:.26s}.fxh-hero--live .fxh-hero__step:first-child .fxh-sub{animation-delay:.48s}.fxh-hero--live .fxh-hero__step:first-child .fxh-ctas{animation-delay:.59s}.fxh-hero--live .fxh-hero__step:first-child .fxh-scroll{animation-delay:.92s}@media (max-width:640px){.fxh-hero__step{padding:72px 20px}}@media (prefers-reduced-motion:reduce){.fxh-caret,.fxh-tick{animation:none}.fxh-hero--live .fxh-hero__step:first-child .fxh-ctas,.fxh-hero--live .fxh-hero__step:first-child .fxh-eyebrow,.fxh-hero--live .fxh-hero__step:first-child .fxh-scroll,.fxh-hero--live .fxh-hero__step:first-child .fxh-sub,.fxh-hero--live .fxh-hero__step:first-child .fxh-title{animation:none;opacity:1;transform:none}}.cb-grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}@media (max-width:640px){.cb-grid--2{grid-template-columns:1fr}}:root{--fxl-mono:\"Geist Mono\", ui-monospace, SFMono-Regular, Menlo, monospace;--fxl-display:\"Sora\", sans-serif;--fxl-ease:cubic-bezier(0.16, 1, 0.3, 1);--fxl-text:#17181b;--fxl-dim:rgba(23, 24, 27, 0.64);--fxl-faint:rgba(23, 24, 27, 0.44);--fxl-line:rgba(24, 24, 27, 0.12);--fxl-line-soft:rgba(24, 24, 27, 0.07);--fxl-amber-text:#8a5e00;--fxl-bg:#f4f4f5;--fxl-panel:#fcfcfd;--fxl-amber-soft:rgba(252, 184, 19, 0.12)}.dark{--fxl-text:#f4f5f3;--fxl-dim:rgba(244, 245, 243, 0.58);--fxl-faint:rgba(244, 245, 243, 0.34);--fxl-line:rgba(255, 255, 255, 0.08);--fxl-line-soft:rgba(255, 255, 255, 0.05);--fxl-amber-text:#fcb813;--fxl-bg:#0a0b0d;--fxl-panel:#0c0e11;--fxl-amber-soft:rgba(252, 184, 19, 0.08)}.fxl-no{display:flex;align-items:center;gap:12px;font-family:var(--fxl-mono);font-size:12px;letter-spacing:.18em;text-transform:uppercase;color:var(--fxl-faint);margin-top:8px}.fxl-no::after{content:\"\";flex:1;height:1px;background:var(--fxl-line-soft)}.fxl-no+h2{margin-top:10px}.fxl-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1px;background:var(--fxl-line);border:1px solid var(--fxl-line);border-radius:16px;overflow:hidden}.fxl-cell{position:relative;display:block;background:var(--fxl-panel);padding:clamp(24px,2.6vw,34px);text-decoration:none!important;transition:background .2s ease}.fxl-cell:hover{background:var(--fxl-amber-soft)}.fxl-cell::after{content:\"\\2192\";position:absolute;top:24px;right:26px;font-family:var(--fxl-mono);font-size:14px;color:var(--fxl-faint);transition:color .2s ease,transform .2s ease}.fxl-cell:hover::after{color:var(--fxl-amber-text);transform:translateX(4px)}.fxl-cell__no{display:block;font-family:var(--fxl-mono);font-size:11px;letter-spacing:.2em;color:var(--fxl-amber-text);margin-bottom:14px}.fxl-cell__title{display:block;font-family:var(--fxl-display);font-size:18px;font-weight:600;letter-spacing:-.01em;color:var(--fxl-text);margin-bottom:6px}.fxl-cell__desc{display:block;font-size:13.5px;line-height:1.5;color:var(--fxl-dim);max-width:46ch}.fxl-grid--1{grid-template-columns:1fr}.fxl-grid--3{grid-template-columns:repeat(3,1fr)}@media (max-width:1024px){.fxl-grid--3{grid-template-columns:repeat(2,1fr)}}@media (max-width:640px){.fxl-grid,.fxl-grid--3{grid-template-columns:1fr}}.fxl-cell--eval{grid-column:1/-1;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);gap:32px;align-items:center}.fxl-cell--eval::after{content:none}.fxl-cell--eval:hover{background:var(--fxl-panel)}.fxl-eval__links{display:flex;flex-wrap:wrap;gap:8px 18px;margin-top:18px}.fxl-eval__links a,.fxl-stack{font-family:var(--fxl-mono);font-size:12px}.fxl-eval__links a{color:var(--fxl-amber-text);text-decoration:none!important;border-bottom:1px solid rgba(252,184,19,.45);padding-bottom:1px}.fxl-eval__links a:hover{border-bottom-color:var(--fxl-amber-text)}.fxl-stack{color:var(--fxl-faint)}.fxl-stack__row{position:relative;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:7px 12px 7px 30px;border-bottom:1px solid var(--fxl-line-soft)}.fxl-rails li:last-child,.fxl-stack__row:last-child{border-bottom:none}.fxl-stack__row span:last-child{font-size:10.5px;letter-spacing:.08em;opacity:.8}.fxl-stack__tick{position:absolute;left:10px;top:50%;width:7px;height:7px;margin-top:-3.5px;border-radius:2px;background:var(--fxl-line)}.fxl-stack__client{border:1px solid var(--fxl-line);border-radius:10px;color:var(--fxl-dim)}.fxl-stack__client .fxl-stack__tick{background:#fcb813}.fxl-stack__gw{display:flex;align-items:center;gap:10px;padding:10px 0 10px 30px;font-size:10.5px;letter-spacing:.16em;text-transform:uppercase}.fxl-stack__gw::after{content:\"\";flex:1;height:1px;background:repeating-linear-gradient(90deg,var(--fxl-line) 0 4px,transparent 4px 8px)}.fxl-stack__svc{position:relative;border:1px solid var(--fxl-line);border-radius:10px;overflow:hidden}.fxl-stack__spine{position:absolute;left:13px;top:0;bottom:0;width:1px;background:var(--fxl-line)}.fxl-stack__pulse{position:absolute;left:10px;top:0;width:7px;height:7px;border-radius:50%;background:#fcb813;box-shadow:0 0 0 4px rgba(252,184,19,.18);opacity:0;animation:fxl-stack-ride 6.6s linear infinite}.fxl-stack__svc .fxl-stack__row,.fxl-stack__svc .fxl-stack__tick{animation:6.6s linear infinite}.fxl-stack__svc .fxl-stack__row{animation-name:fxl-stack-lit}.fxl-stack__svc .fxl-stack__tick{animation-name:fxl-stack-tick}.fxl-stack__svc .fxl-stack__row:nth-child(4),.fxl-stack__svc .fxl-stack__row:nth-child(4) .fxl-stack__tick{animation-delay:.55s}.fxl-stack__svc .fxl-stack__row:nth-child(5),.fxl-stack__svc .fxl-stack__row:nth-child(5) .fxl-stack__tick{animation-delay:1.1s}.fxl-stack__svc .fxl-stack__row:nth-child(6),.fxl-stack__svc .fxl-stack__row:nth-child(6) .fxl-stack__tick{animation-delay:1.65s}.fxl-stack__svc .fxl-stack__row:nth-child(7),.fxl-stack__svc .fxl-stack__row:nth-child(7) .fxl-stack__tick{animation-delay:2.2s}.fxl-stack__svc .fxl-stack__row:nth-child(8),.fxl-stack__svc .fxl-stack__row:nth-child(8) .fxl-stack__tick{animation-delay:2.75s}.fxl-stack__foot{display:flex;justify-content:space-between;margin-top:8px;font-size:10.5px;letter-spacing:.14em;text-transform:uppercase}.fxl-rails a:hover,.fxl-stack__bus{color:var(--fxl-amber-text)}@media (prefers-reduced-motion:reduce){.fxl-stack__pulse,.fxl-stack__svc .fxl-stack__row,.fxl-stack__svc .fxl-stack__tick{animation:none}.fxl-stack__svc .fxl-stack__row{color:var(--fxl-dim)}}@media (max-width:768px){.fxl-cell--eval{grid-template-columns:1fr;gap:24px}}.fxl-flow{display:flex;align-items:stretch;gap:14px}.fxl-flow__stage{flex:1;border:1px solid var(--fxl-line);background:var(--fxl-panel);border-radius:14px;padding:20px 22px}.fxl-flow__no{display:block;font-family:var(--fxl-mono);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--fxl-amber-text);margin-bottom:10px}.fxl-flow__title{display:block;font-family:var(--fxl-display);font-size:15px;font-weight:600;letter-spacing:-.01em;color:var(--fxl-text)}.fxl-flow__desc{display:block;margin-top:6px;font-size:12.5px;line-height:1.5;color:var(--fxl-dim)}.fxl-flow__arrow{align-self:center;flex-shrink:0;font-family:var(--fxl-mono);font-size:16px;color:var(--fxl-amber-text)}@media (max-width:768px){.fxl-flow{flex-direction:column}.fxl-flow__arrow{transform:rotate(90deg)}}.fxl-rails{list-style:none;padding:0;margin:0;font-family:var(--fxl-mono);font-size:13px;color:var(--fxl-dim)}.fxl-rails li{display:flex;align-items:baseline;gap:12px;padding:12px 0;border-bottom:1px solid var(--fxl-line-soft)}.fxl-rails__state{align-self:center;flex-shrink:0;width:7px;height:7px;border-radius:2px;background:#fcb813}.fxl-rails a{color:var(--fxl-text);text-decoration:none;border-bottom:1px solid rgba(252,184,19,.45);padding-bottom:1px;transition:color .15s ease}.fxl-rails em{margin-left:auto;padding-left:16px;flex-shrink:0;font-style:normal;font-size:11px;letter-spacing:.1em;color:var(--fxl-faint)}.fxl-proc{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;list-style:none;padding:0;margin:0;background:var(--fxl-line);border:1px solid var(--fxl-line);border-radius:16px;overflow:hidden}.fxl-proc li{background:var(--fxl-bg);padding:clamp(22px,2.4vw,32px);margin:0}.fxl-proc a,.fxl-proc__no{font-family:var(--fxl-mono);color:var(--fxl-amber-text)}.fxl-proc__no{display:block;font-size:11px;letter-spacing:.2em;margin-bottom:16px}.fxl-proc__title{display:block;font-family:var(--fxl-display);font-size:17px;font-weight:600;letter-spacing:-.01em;color:var(--fxl-text);margin-bottom:8px}.fxl-proc__desc{display:block;font-size:13.5px;line-height:1.55;color:var(--fxl-dim)}.fxl-proc a{display:inline-block;margin-top:12px;font-size:12px;text-decoration:none;border-bottom:1px solid rgba(252,184,19,.45);padding-bottom:1px}.fxl-proc a:hover{border-bottom-color:var(--fxl-amber-text)}@media (max-width:1024px){.fxl-proc{grid-template-columns:repeat(2,1fr)}}@media (max-width:640px){.fxl-proc{grid-template-columns:1fr}}.fxl-reg{border:1px solid var(--fxl-line);background:var(--fxl-panel);border-radius:16px;padding:clamp(16px,2.5vw,28px)}.fxl-reg__hd,.fxl-reg__row{display:grid;grid-template-columns:minmax(180px,1.2fr) 2fr 150px 24px;gap:16px;align-items:baseline;font-family:var(--fxl-mono)}.fxl-reg__hd{font-size:11px;letter-spacing:.08em;color:var(--fxl-faint);padding-bottom:10px}.fxl-reg__hd,.fxl-reg__item{border-bottom:1px solid var(--fxl-line-soft)}.fxl-reg__item:last-child{border-bottom:none}.fxl-reg__toggle{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.fxl-reg__row{padding:14px 0;cursor:pointer;font-size:12.5px;user-select:none}.fxl-reg__toggle:focus-visible+.fxl-reg__row{outline:2px solid #fcb813;outline-offset:2px}.fxl-reg__type{font-size:10px;letter-spacing:.12em;color:var(--fxl-faint);margin-left:6px}.fxl-reg__type--lts,a.fxl-reg__row:hover .fxl-reg__name{color:var(--fxl-amber-text)}a.fxl-reg__row{text-decoration:none!important;transition:background .15s ease}a.fxl-reg__row:hover{background:var(--fxl-amber-soft)}.fxl-reg__name{color:var(--fxl-text);font-weight:500}.fxl-reg__caps{color:var(--fxl-dim)}.fxl-reg__status{color:var(--fxl-amber-text);white-space:nowrap}.fxl-reg__mark{color:var(--fxl-amber-text);font-size:14px;text-align:right;transition:transform .3s var(--fxl-ease)}.fxl-reg__item:has(.fxl-reg__toggle:checked) .fxl-reg__mark{transform:rotate(45deg)}.fxl-reg__body{display:none;padding:2px 0 18px;font-size:13.5px;line-height:1.6;color:var(--fxl-dim);max-width:72ch}.fxl-reg__item:has(.fxl-reg__toggle:checked) .fxl-reg__body{display:block}.fxl-reg__body p{margin:0 0 8px}.fxl-reg__body strong{color:var(--fxl-text);font-weight:600}@media (max-width:768px){.fxl-reg__hd,.fxl-reg__row{grid-template-columns:1fr 132px 20px;gap:10px}.fxl-reg__caps,.fxl-reg__hd span:nth-child(2){display:none}}.fxl-dgv{display:grid;gap:10px}.fxl-dgv__row{display:grid;grid-template-columns:150px 1fr;gap:18px;align-items:baseline;border:1px solid var(--fxl-line);border-radius:12px;padding:14px 20px}.fxl-dgv__key{font-family:var(--fxl-mono);font-size:12.5px;color:var(--fxl-amber-text)}.fxl-dgv__val{font-size:13.5px;line-height:1.55;color:var(--fxl-dim)}@media (max-width:640px){.fxl-dgv__row{grid-template-columns:1fr;gap:6px}}.fxl-cta{position:relative;overflow:hidden;border-radius:18px;padding:clamp(40px,6vw,64px) clamp(24px,5vw,56px);background:#0a0b0d;border:1px solid rgba(255,255,255,.08);text-align:center}.fxl-cta::before{content:\"\";position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.045) 1px,transparent 1px);background-size:56px 56px;-webkit-mask-image:radial-gradient(ellipse at 50% 100%,#000 25%,transparent 75%);mask-image:radial-gradient(ellipse at 50% 100%,#000 25%,transparent 75%);pointer-events:none}.fxl-cta>*{position:relative;z-index:1}.fxl-cta__title{display:block;font-family:var(--fxl-display);font-size:clamp(1.5rem,3vw,2.2rem);font-weight:700;letter-spacing:-.02em;line-height:1.1;color:#f5f5f0;margin-bottom:12px}.fxl-cta__sub{display:block;font-size:14.5px;color:#b9b9b1;max-width:56ch;margin:0 auto 24px}html.fxl-js .rv{opacity:0;transform:translateY(12px);transition:opacity .6s var(--fxl-ease),transform .6s var(--fxl-ease);transition-delay:calc(var(--i, 0)*.06s)}html.fxl-js .rv.in{opacity:1;transform:none}@media (prefers-reduced-motion:reduce){html.fxl-js .rv{opacity:1;transform:none;transition:none}.fxl-rails__state{animation:none}}"}],"page":{"pagePath":"5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow","slug":"/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow","pageMetadata":{"title":"Workflow node reference: control flow and integration nodes","sidebarTitle":"Control flow nodes","description":"Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.","owner":"docs","last_reviewed":"2026-10-26T00:00:00.000Z","href":"/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.\"\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,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,hr:`hr`,img:`img`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,Badge,Card,CardGroup,Check,CodeBlock,Frame,Heading,Info,Note,Step,Steps,Tab,Table,Tabs,Tip,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!Badge)_missingMdxReference(`Badge`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Check)_missingMdxReference(`Check`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`This page describes the control flow and integration nodes you use in `,_jsx(_components.a,{href:`/5.9/docs/platform-deep-dive/integrations/integration-workflows`,children:`Integration Designer workflows`}),`. For every node type, see the `,_jsx(_components.a,{href:`/5.9/docs/platform-deep-dive/integrations/integration-workflows#workflow-nodes-overview`,children:`workflow nodes overview`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`start-node`,children:`Start node`}),`\n`,_jsx(_components.p,{children:`The Start node is the mandatory first node in any workflow. It defines the input data model and passes this data to subsequent nodes.`}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Define all required input fields in the Start node to ensure data mapping from processes or user tasks.`})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`Use `,_jsx(_components.a,{href:`/5.9/docs/platform-deep-dive/integrations/workflow-data-models`,children:`Workflow Data Models`}),` to define structured input and output parameters at the workflow level. Input parameters automatically pre-fill the Start Node from the data model.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`external-triggers`,children:`External triggers`}),`\n`,_jsx(Badge,{color:`blue`,icon:`cloud`,children:`SaaS · 5.12`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Available on SaaS with FlowX.AI 5.12.`}),` This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.`]})}),`\n`,_jsx(_components.p,{children:`A workflow normally runs when something calls it: a process, a parent workflow, or the run button. Turn on an external trigger and it starts on its own, when a webhook is called or an email arrives.`}),`\n`,_jsxs(_components.p,{children:[`Open the `,_jsx(_components.strong,{children:`Start`}),` node, expand `,_jsx(_components.strong,{children:`External Triggers`}),`, switch `,_jsx(_components.strong,{children:`Enable trigger`}),` on, then choose `,_jsx(_components.strong,{children:`Webhook`}),` or `,_jsx(_components.strong,{children:`Email`}),` and pick the data source that receives the event.`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/5.9/start_node_trigger_example.png`,alt:`Start node with External Triggers enabled, a webhook data source selected, and the Start payload showing the webhookMessage schema`})})}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`External triggers are available on Output Focused workflows only. Configuring one on another workflow type is rejected.`})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`To run a workflow on a schedule on SaaS, add a schedule to its Start node. See `,_jsx(_components.a,{href:`#how-do-i-run-a-workflow-on-a-schedule`,children:`How do I run a workflow on a schedule?`}),`. Self-hosted deployments get workflow schedules with the next LTS release. Until then, create a process with a Timer Start Event and call the workflow from it with a `,_jsx(_components.strong,{children:`Start Integration Workflow`}),` action. See `,_jsx(_components.a,{href:`/5.9/docs/projects/runtime/scheduled-processes`,children:`Scheduled processes`}),`.`]})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Before you can pick a webhook`}),`, the webhook data source has to be set to `,_jsx(_components.strong,{children:`Start a Process/Workflow`}),`. A data source set to `,_jsx(_components.strong,{children:`Resume a Waiting Process`}),` is refused, and because Webhook Behavior cannot be changed after the first save, a resume webhook can never be reused here: create a new one. See `,_jsx(_components.a,{href:`/5.9/docs/platform-deep-dive/integrations/incoming-webhooks#webhook-behavior`,children:`Webhook Behavior`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`The event lands in the data model.`}),` Enabling the trigger adds an entity for the incoming event, and turning the trigger off removes it again, so switch it on before mapping anything downstream.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Trigger`}),_jsx(_components.th,{children:`Entity`}),_jsx(_components.th,{children:`Contents`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Webhook`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`webhookMessage`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`dateTime`}),`, `,_jsx(_components.code,{children:`payload`}),`, `,_jsx(_components.code,{children:`headers`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Email`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`emailMessage`})}),_jsxs(_components.td,{children:[`See the `,_jsx(_components.a,{href:`/5.9/docs/platform-deep-dive/integrations/email-trigger#email-data-schema`,children:`email data schema`})]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`payload`}),` holds the request body as sent, nested structure intact. `,_jsx(_components.code,{children:`headers`}),` holds each header as a `,_jsx(_components.strong,{children:`list`}),` of strings, so a single-valued header still arrives as a one-element list.`]}),`\n`,_jsx(_components.p,{children:`A script node can then read it directly:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`3`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`var`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` msg`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`input`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`webhookMessage`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`var`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` order`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`msg`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`payload`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`output`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`orderSummary`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` = `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`order`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`client`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` + `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\" wants \"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` + `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`order`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`suma`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` + `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\" \"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` + `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`order`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`detalii`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`moneda`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Activate the trigger`}),` before it accepts anything. Go to `,_jsx(_components.strong,{children:`Runtime`}),` → `,_jsx(_components.strong,{children:`Manage Triggers`}),` and activate it there. The list also shows how many resources each trigger is bound to.`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/5.9/manage_triggers_5.9.x.png`,alt:`Manage Triggers listing webhook triggers with their state and the resources each is used in`})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`One data source can be bound to several workflows, and a single incoming event then starts `,_jsx(_components.strong,{children:`all`}),` of them. The Manage Triggers list shows this as a resource count above one. Bind a data source to a second workflow only when you mean to run both.`]})}),`\n`,_jsx(Card,{title:`Incoming webhooks`,icon:`webhook`,href:`/5.9/docs/platform-deep-dive/integrations/incoming-webhooks`,children:_jsx(_components.p,{children:`Creating a webhook data source, Webhook Behavior, providers, the URL and its API key`})}),`\n`,_jsx(Card,{title:`Email trigger`,icon:`envelope`,href:`/5.9/docs/platform-deep-dive/integrations/email-trigger`,children:_jsx(_components.p,{children:`Creating an email trigger data source, filtering, polling, and the email data schema`})}),`\n`,_jsx(Heading,{level:`3`,id:`how-do-i-run-a-workflow-on-a-schedule`,children:`How do I run a workflow on a schedule?`}),`\n`,_jsx(Badge,{color:`blue`,icon:`cloud`,children:`SaaS · 6.0`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Available on SaaS with FlowX.AI 6.0.`}),` This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.`]})}),`\n`,_jsxs(_components.p,{children:[`Add a schedule to the workflow’s `,_jsx(_components.strong,{children:`Start`}),` node, then activate it in `,_jsx(_components.strong,{children:`Runtime`}),` → `,_jsx(_components.strong,{children:`Runtime Settings`}),` → `,_jsx(_components.strong,{children:`Schedules`}),`. From then on the workflow starts by itself at each fire time, with no process or caller involved.`]}),`\n`,_jsx(_components.p,{children:`Schedules are available on Output Focused workflows. A workflow can have up to 50 schedules, and each one needs a name that is unique on that workflow.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Add a schedule`,children:_jsxs(_components.p,{children:[`Open the `,_jsx(_components.strong,{children:`Start`}),` node, expand `,_jsx(_components.strong,{children:`Schedules`}),`, and click `,_jsx(_components.strong,{children:`Add schedule`}),`. Click the new schedule card to open the `,_jsx(_components.strong,{children:`Schedule Workflow`}),` dialog, and give the schedule a `,_jsx(_components.strong,{children:`Name`}),`.`]})}),_jsxs(Step,{title:`Set when it fires`,children:[_jsxs(_components.p,{children:[`Choose a `,_jsx(_components.strong,{children:`Timer Type`}),`:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Date`}),` fires once, at the `,_jsx(_components.strong,{children:`Fire at`}),` date and time, entered in your local time.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Cycle`}),` fires repeatedly. Pick a `,_jsx(_components.strong,{children:`Format`}),`, `,_jsx(_components.strong,{children:`ISO`}),` or `,_jsx(_components.strong,{children:`Cron`}),`, then build the expression with `,_jsx(_components.strong,{children:`Guided`}),` fields or type it under `,_jsx(_components.strong,{children:`Expression`}),`.`]}),`\n`]}),_jsxs(_components.p,{children:[`The dialog previews the next fire times in your local time zone. Check them, then click `,_jsx(_components.strong,{children:`Save`}),`.`]})]}),_jsx(Step,{title:`Activate the schedule`,children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Runtime`}),` → `,_jsx(_components.strong,{children:`Runtime Settings`}),` → `,_jsx(_components.strong,{children:`Schedules`}),`, filter `,_jsx(_components.strong,{children:`Origin`}),` by `,_jsx(_components.strong,{children:`Workflow`}),`, and click `,_jsx(_components.strong,{children:`Activate`}),` on the schedule. The workflow must be part of the project’s active build.`]})})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Saving a schedule or publishing a build never activates it. A schedule fires only after you activate it on the `,_jsx(_components.strong,{children:`Schedules`}),` page.`]})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Which cycle format should I use?`})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Format`}),_jsx(_components.th,{children:`How it fires`}),_jsx(_components.th,{children:`Example`}),_jsx(_components.th,{children:`Rules`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`ISO`})}),_jsx(_components.td,{children:`Repeats an ISO 8601 interval a set number of times, or indefinitely`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`R5/P1D`}),`: five times, once a day`]}),_jsxs(_components.td,{children:[`The interval must be longer than zero, in whole seconds. A `,_jsx(_components.strong,{children:`Start Time`}),`, if you set one, must be in the future.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Cron`})}),_jsx(_components.td,{children:`Fires on a six-field cron schedule: second, minute, hour, day of month, month, day of week`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`0 */5 * * * ?`}),`: every five minutes`]}),_jsxs(_components.td,{children:[`Cron is read in UTC. Set an `,_jsx(_components.strong,{children:`Active window`}),` with a `,_jsx(_components.strong,{children:`Start`}),` and an `,_jsx(_components.strong,{children:`End`}),`: the schedule fires only between them. Macros such as `,_jsx(_components.code,{children:`@daily`}),` and `,_jsx(_components.code,{children:`@hourly`}),` also work.`]})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`What does a scheduled run receive?`}),` A scheduled run doesn’t use the Start node’s test payload. Its input holds three fields that you can map like any other input:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Contents`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`firedAt`})}),_jsx(_components.td,{children:`When the run actually started, as an ISO 8601 timestamp`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`scheduledFor`})}),_jsx(_components.td,{children:`When the schedule was due, as an ISO 8601 timestamp`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`triggerName`})}),_jsx(_components.td,{children:`The name of the schedule that started the run`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Where do scheduled runs show up?`}),` In `,_jsx(_components.a,{href:`/5.9/docs/projects/runtime/workflow-instances`,children:`Workflow Instances`}),`, with the origin `,_jsx(_components.strong,{children:`Schedule`}),`. The run details name the schedule that started it.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`How do I stop a schedule?`}),` To pause it, click `,_jsx(_components.strong,{children:`Deactivate`}),` on the `,_jsx(_components.strong,{children:`Schedules`}),` page, and click `,_jsx(_components.strong,{children:`Activate`}),` to resume it. To remove it for good, delete it from its card on the `,_jsx(_components.strong,{children:`Start`}),` node. A deleted schedule stops firing immediately, and the deletion can’t be undone.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`rest-api-call-node`,children:`REST API Call node`}),`\n`,_jsx(_components.p,{children:`Enables communication with external systems via REST API calls. Supports GET, POST, PUT, PATCH, and DELETE methods. Endpoints are selected from a dropdown, grouped by system.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Params`}),`: Configure path, query, and header parameters.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Input/Output`}),`: Input is auto-populated from the previous node; output displays the API response.`]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`You can test REST API Call nodes independently to validate connections and data retrieval.`})}),`\n`,_jsx(Heading,{level:`3`,id:`when-does-a-rest-api-call-node-take-its-failure-exit`,children:`When does a REST API Call node take its failure exit?`}),`\n`,_jsxs(_components.p,{children:[`A REST API Call node has a success exit and a failure exit. It takes the success exit only for a `,_jsx(_components.code,{children:`2xx`}),` response without errors. Everything else takes the failure exit:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`a non-`,_jsx(_components.code,{children:`2xx`}),` response;`]}),`\n`,_jsxs(_components.li,{children:[`a timeout, stored as status `,_jsx(_components.code,{children:`408`}),` with `,_jsx(_components.code,{children:`data.timeout: true`}),` (set the limit with `,_jsx(_components.strong,{children:`Timeout`}),` on the node’s `,_jsx(_components.strong,{children:`Settings`}),` tab, default `,_jsx(_components.code,{children:`10000`}),` ms);`]}),`\n`,_jsx(_components.li,{children:`a connection error;`}),`\n`,_jsx(_components.li,{children:`a response body declared as JSON or XML that can’t be parsed.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`With `,_jsx(_components.strong,{children:`Allow Retry`}),` on, a `,_jsx(_components.code,{children:`408`}),`, `,_jsx(_components.code,{children:`429`}),`, `,_jsx(_components.code,{children:`500`}),`, `,_jsx(_components.code,{children:`502`}),`, `,_jsx(_components.code,{children:`503`}),`, or `,_jsx(_components.code,{children:`504`}),` is retried first, and the node takes the failure exit only once the retries are used up.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`If the call fails and the failure exit isn’t connected, the workflow instance fails with `,_jsx(_components.code,{children:`Workflow is missing outgoing sequence.`}),` It doesn’t fall through to the success exit.`]})}),`\n`,_jsxs(_components.p,{children:[`On both exits the node writes its result under its response key: `,_jsx(_components.code,{children:`data`}),` (the parsed body), `,_jsx(_components.code,{children:`metadata`}),` (`,_jsx(_components.code,{children:`statusCode`}),` and `,_jsx(_components.code,{children:`headers`}),`), `,_jsx(_components.code,{children:`hasError`}),` and `,_jsx(_components.code,{children:`errorMessage`}),`. `,_jsx(_components.code,{children:`hasError`}),` only flags connection and parsing errors: a `,_jsx(_components.code,{children:`4xx`}),` or `,_jsx(_components.code,{children:`5xx`}),` with a readable body has `,_jsx(_components.code,{children:`hasError: false`}),` even though the node took the failure exit, and on a timeout it isn’t set. To branch on the outcome, use the exits or `,_jsx(_components.code,{children:`metadata.statusCode`}),`, not `,_jsx(_components.code,{children:`hasError`}),`.`]}),`\n`,_jsx(_components.p,{children:`Errors while building the request, such as a failed input mapping or a missing endpoint, don’t use the failure exit. They fail the workflow instance.`}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`flowx-database-node`,children:`FlowX database node`}),`\n`,_jsx(_components.p,{children:`Allows you to read and write data to the FlowX Database within your workflow.`}),`\n`,_jsx(Card,{title:`FlowX Database Documentation`,icon:`database`,href:`/5.9/docs/platform-deep-dive/integrations/flowx-database`,children:_jsx(_components.p,{children:`Learn more about FlowX Database operations, collections, and usage`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`condition-fork-node`,children:`Condition (Fork) node`}),`\n`,_jsx(_components.p,{children:`Evaluates logical conditions (JavaScript or Python) to direct workflow execution along different branches.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`If/Else`}),`: Routes based on condition evaluation.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`One branch per run`}),`: The node follows the first branch whose condition passes, or the Else branch. To run branches at the same time, use the `,_jsx(_components.a,{href:`#start-parallel-and-end-parallel-nodes`,children:`Start Parallel and End Parallel nodes`}),`.`]}),`\n`]}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Use fork nodes to implement business rules, error handling, or multi-path logic.`})}),`\n`,_jsx(Heading,{level:`3`,id:`available-bindings`,children:`Available bindings`}),`\n`,_jsx(_components.p,{children:`Condition expressions have access to the following data bindings:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Binding`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`input`})}),_jsx(_components.td,{children:`Workflow input data from the previous node`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`additionalData.securityDetails`})}),_jsx(_components.td,{children:`Current user’s identity (username, identifier, details including roles, groups, and attributes from 5.7.0 onward)`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`additionalData.applicationConfiguration`})}),_jsx(_components.td,{children:`Configuration parameters from the app build`})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`condition-examples`,children:`Condition examples`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`JavaScript`,id:`javascript`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// Route based on user identity`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`additionalData`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`securityDetails`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`username`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` === `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'admin@company.com'`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// Route based on configuration parameter`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`additionalData`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`applicationConfiguration`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`featureEnabled`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` === `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// Combine input data with config parameters`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`input`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`amount`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` > `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`additionalData`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`applicationConfiguration`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`approvalThreshold`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// Check user and input together`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`input`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`priority`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` === `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'high'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` \u0026\u0026 `}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`additionalData`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`securityDetails`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`details`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`email`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`endsWith`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`'@company.com'`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})})}),_jsx(Tab,{title:`Python`,id:`python`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`11`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# Route based on user identity`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`additionalData[`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"securityDetails\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`][`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"username\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`] == `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"admin@company.com\"`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# Route based on configuration parameter`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`additionalData[`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"applicationConfiguration\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`][`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"featureEnabled\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`] == `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`True`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# Combine input data with config parameters`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`input`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"amount\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`] > additionalData[`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"applicationConfiguration\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`][`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"approvalThreshold\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# Check user and input together`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`input`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"priority\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`] == `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"high\"`}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:` and`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:` additionalData[`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"securityDetails\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`][`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"details\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`][`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"email\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`].endswith(`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"@company.com\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})})})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`For details on the `,_jsx(_components.code,{children:`securityDetails`}),` and `,_jsx(_components.code,{children:`applicationConfiguration`}),` structure, see `,_jsx(_components.a,{href:`/5.9/docs/building-blocks/actions/business-rule-action/extracting-additional-data`,children:`Extracting additional data in business rules`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`calling-reusable-functions-in-conditions`,children:`Calling reusable functions in conditions`}),`\n`,_jsx(Badge,{color:`blue`,icon:`cloud`,children:`SaaS · 5.11`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Available on SaaS with FlowX.AI 5.11.`}),` This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.`]})}),`\n`,_jsxs(_components.p,{children:[`Condition expressions can call the `,_jsx(_components.a,{href:`/5.9/docs/building-blocks/reusable-resources/reusable-functions`,children:`reusable functions`}),` defined in your project, so branch routing can reuse the same business logic as your processes. Call a function inside a condition using the standard syntax:`]}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`JavaScript`,id:`javascript-2`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`// Route on the result of a reusable function`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`functions`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`lending`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`isEligible`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`input`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`applicant`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`) === `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`]})})})}),_jsx(Tab,{title:`Python`,id:`python-2`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6A9955`,\"--shiki-dark\":`#6A9955`},children:`# Route on the result of a reusable function`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`functions.lending.isEligible(`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`input`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:`\"applicant\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`]) == `}),_jsx(_components.span,{style:{color:`#569CD6`,\"--shiki-dark\":`#569CD6`},children:`True`})]}),`\n`]})})})})]}),`\n`,_jsx(_components.p,{children:`Each branch condition can call functions, and the node resolves the functions referenced across all of its branches together. Resolution follows the same rules as the Script node: calls resolve from the workflow’s build, a function that calls another function resolves its full call chain, and cross-app calls are matched by app name.`}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`As with Script nodes, reusable functions resolve only in a build context. A draft or test run with no build resolves no functions.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`start-parallel-and-end-parallel-nodes`,children:`Start Parallel and End Parallel nodes`}),`\n`,_jsxs(_components.p,{children:[`Run several steps of a workflow at the same time with a pair of nodes: `,_jsx(_components.strong,{children:`Start Parallel`}),` splits the flow into branches that all run at once, and `,_jsx(_components.strong,{children:`End Parallel`}),` waits for every branch, merges what the branches wrote, and continues. In the node palette they sit under `,_jsx(_components.strong,{children:`Flow Control`}),` as `,_jsx(_components.strong,{children:`Start Parallel Path`}),` and `,_jsx(_components.strong,{children:`End Parallel Path`}),`. Dropped on the canvas, they are named `,_jsx(_components.strong,{children:`Start Parallel`}),` and `,_jsx(_components.strong,{children:`End Parallel`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`These nodes are the only way to run branches concurrently. A `,_jsx(_components.a,{href:`#condition-fork-node`,children:`Condition (Fork) node`}),` evaluates its conditions and follows one branch.`]}),`\n`,_jsx(Frame,{children:_jsx(`video`,{controls:true,src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/5.x/parallel_wf.mp4`,autoPlay:true,muted:true,loop:true,playsInline:`true`})}),`\n`,_jsx(Heading,{level:`3`,id:`how-do-i-run-steps-in-parallel`,children:`How do I run steps in parallel?`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Add a Start Parallel node`,children:_jsxs(_components.p,{children:[`Drag `,_jsx(_components.strong,{children:`Start Parallel Path`}),` from the `,_jsx(_components.strong,{children:`Flow Control`}),` group onto the canvas and connect the previous node to it.`]})}),_jsx(Step,{title:`Create one sequence per branch`,children:_jsx(_components.p,{children:`Draw a sequence from the Start Parallel node to the first node of each branch. Every outgoing sequence is a branch. A branch needs at least one node: the Designer does not let you connect a Start Parallel node straight to an End Parallel or End Flow node.`})}),_jsx(Step,{title:`Build each branch`,children:_jsx(_components.p,{children:`Add the nodes each branch needs: REST endpoints, scripts, FlowX Database operations, AI nodes, subworkflows, or another Start Parallel node for nested branches.`})}),_jsx(Step,{title:`Close every branch on the same End Parallel node`,children:_jsxs(_components.p,{children:[`Connect the last node of every branch to one `,_jsx(_components.strong,{children:`End Parallel Path`}),` node, then connect that node to whatever comes next. An End Parallel node allows a single outgoing sequence.`]})})]}),`\n`,_jsx(_components.p,{children:`At runtime all branches run concurrently. The End Parallel node completes when the slowest branch reaches it, so the branch section takes as long as its longest branch, not the sum of the branches.`}),`\n`,_jsx(Heading,{level:`3`,id:`what-data-does-each-branch-see`,children:`What data does each branch see?`}),`\n`,_jsxs(_components.p,{children:[`Each branch starts with a `,_jsx(_components.strong,{children:`deep copy`}),` of the workflow data as it was when the Start Parallel node ran. Branches work on independent copies: a branch cannot read what another branch writes while they run.`]}),`\n`,_jsx(Heading,{level:`3`,id:`how-are-the-branches-merged`,children:`How are the branches merged?`}),`\n`,_jsx(_components.p,{children:`When a branch reaches the End Parallel node, the keys that branch wrote are merged into the parent data with a recursive deep merge, in the order the branches finish:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Keys written by only one branch are kept.`}),`\n`,_jsx(_components.li,{children:`A key written by two branches ends up with the value from the branch that finished last.`}),`\n`,_jsx(_components.li,{children:`Nested objects are merged key by key, so only the conflicting leaf values are overwritten.`}),`\n`,_jsx(_components.li,{children:`Arrays and all other non-object values are replaced whole. There is no element-level merge, so two branches cannot each fill a different element of the same array.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Because the merge order depends on which branch finishes last, two branches that write the same key give a non-deterministic result.`}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Have each branch write to its own key, for example `,_jsx(_components.code,{children:`apiResultA`}),`, `,_jsx(_components.code,{children:`apiResultB`}),` and `,_jsx(_components.code,{children:`apiResultC`}),`, and combine them in a Script node after the End Parallel node.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`what-happens-when-a-branch-fails`,children:`What happens when a branch fails?`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A node that fails inside a branch follows the same rules as anywhere else in the workflow. If its failure exit is connected, the branch continues on that path and must still reach the End Parallel node. If the failure exit is not connected, the workflow instance fails.`}),`\n`,_jsx(_components.li,{children:`When the instance fails, the other branches stop at the next node they reach. Nothing they already executed is rolled back.`}),`\n`,_jsxs(_components.li,{children:[`If the branches of one Start Parallel node end on different End Parallel nodes, or one End Parallel node receives branches from two different Start Parallel nodes, the run fails with `,_jsx(_components.code,{children:`Missing end parallel gateway`}),` and the cause `,_jsx(_components.code,{children:`Parallel branches merge failed: missing or incompatible end parallel node.`})]}),`\n`,_jsxs(_components.li,{children:[`A Start Parallel node with no outgoing sequence fails the run with `,_jsx(_components.code,{children:`Workflow is missing outgoing sequences.`})]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`runtime-view`,children:`Runtime view`}),`\n`,_jsx(Accordion,{title:`Console logging`,id:`console-logging`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Start Parallel node`}),`: the Input tab shows the data handed to the branches.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`End Parallel node`}),`: the Output tab shows the merged result of all branches.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Path grouping`}),`: the nodes of each branch are grouped by path, so you can follow one branch at a time.`]}),`\n`]})}),`\n`,_jsx(Accordion,{title:`Path timing`,id:`path-timing`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Path time`}),`: sum of the execution times of the nodes in that branch.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`End Parallel time`}),`: the node’s own processing time plus the longest path time.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Example`}),`: if branch A takes 2s and branch B takes 5s, the End Parallel node completes after 5s plus its own processing time.`]}),`\n`]})}),`\n`,_jsx(Heading,{level:`3`,id:`use-cases`,children:`Use cases`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Multiple API calls`,icon:`cloud`,children:_jsx(_components.p,{children:`Call several independent APIs at once instead of one after the other.`})}),_jsx(Card,{title:`Data enrichment`,icon:`database`,children:_jsx(_components.p,{children:`Fetch data from several sources in parallel and combine it afterwards.`})}),_jsx(Card,{title:`Notification broadcasting`,icon:`bell`,children:_jsx(_components.p,{children:`Send notifications through several channels (email, SMS, push) at the same time.`})}),_jsx(Card,{title:`Document processing`,icon:`file-lines`,children:_jsx(_components.p,{children:`Process different document types or sections in parallel.`})})]}),`\n`,_jsx(Heading,{level:`3`,id:`limitations`,children:`Limitations`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Same End Parallel node for all branches`}),`: every branch of a Start Parallel node must end on the same End Parallel node, and that node allows one outgoing sequence.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Last-write-wins merge`}),`: write to distinct keys per branch and combine them in a Script node afterwards.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No element-level array merge`}),`: you cannot process the first element of an array in one branch and the second in another.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`No cross-branch reads`}),`: branches run on independent data copies and cannot see each other’s writes until the merge.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Nesting is allowed`}),`: a branch can contain its own Start Parallel and End Parallel pair.`]}),`\n`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`script-node`,children:`Script node`}),`\n`,_jsx(_components.p,{children:`Executes custom JavaScript or Python code to transform, map, or enrich data between nodes.`}),`\n`,_jsxs(_components.p,{children:[`The node’s `,_jsx(_components.code,{children:`output`}),` is merged into the workflow data, the same way business rule output is merged into process data: keys the script doesn’t write keep their values, and writing `,_jsx(_components.code,{children:`{}`}),` to an existing object changes nothing. To clear a key, set it to `,_jsx(_components.code,{children:`null`}),`. For the full merge rules, see `,_jsx(_components.a,{href:`/5.9/docs/building-blocks/supported-scripts#how-output-is-merged-into-process-data`,children:`How output is merged into process data`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`calling-reusable-functions`,children:`Calling reusable functions`}),`\n`,_jsx(Badge,{color:`blue`,icon:`cloud`,children:`SaaS · 5.11`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Available on SaaS with FlowX.AI 5.11.`}),` This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.`]})}),`\n`,_jsxs(_components.p,{children:[`A Script node can call the `,_jsx(_components.a,{href:`/5.9/docs/building-blocks/reusable-resources/reusable-functions`,children:`reusable functions`}),` defined in your project, the same way a process Business Rule action does. Write the call directly in the node’s code using the standard syntax:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`functions`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`projectName`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#DCDCAA`,\"--shiki-dark\":`#DCDCAA`},children:`functionName`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`input`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:`params`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The Designer reads the function calls from your script and links the node to those functions automatically, so there is no separate step to register a reference. The linked functions also appear on each function’s `,_jsx(_components.strong,{children:`Usages`}),` tab, and removing the node clears those usage entries. `]}),`\n`,_jsx(_components.p,{children:`Function calls resolve from the app version that the workflow runs in, and a function that calls another function resolves its full call chain. Functions defined in a different app are matched by their app name, so cross-app calls work the same way they do in processes.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Reusable functions resolve only in a build context. The Script node’s `,_jsx(_components.strong,{children:`Test`}),` modal resolves them when you run it against a selected build; a draft or preview run with no build in context resolves no functions, so calls to `,_jsx(_components.code,{children:`functions.*`}),` return no result until a build is selected.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`testing-a-script-in-isolation`,children:`Testing a script in isolation`}),`\n`,_jsxs(_components.p,{children:[`A Script node ships with a `,_jsx(_components.strong,{children:`Test modal`}),` that lets you exercise the script against sample input without running the full workflow. Open it with the `,_jsx(_components.strong,{children:`expand`}),` icon at the top-right corner of the code editor, next to the expand/collapse chevron.`]}),`\n`,_jsx(_components.p,{children:`The modal has three side-by-side panels:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Panel`}),_jsx(_components.th,{children:`Purpose`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Input`})}),_jsx(_components.td,{children:`JSON input passed to the script. Load from a past individual node run or from a past workflow run via the input selector.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Code`})}),_jsxs(_components.td,{children:[`The script body. Inline warnings are surfaced as you type. Includes `,_jsx(_components.strong,{children:`Save`}),` and `,_jsx(_components.strong,{children:`Test`}),` buttons.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Output`})}),_jsxs(_components.td,{children:[`The JSON returned by the script after running `,_jsx(_components.strong,{children:`Test`}),`. Runtime errors are shown here.`]})]})]})]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Test`}),` button runs the current contents of the Code panel, even if you have not clicked `,_jsx(_components.strong,{children:`Save`}),` yet. Use this to iterate on a fix without committing changes to the Script node.`]})}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Runs triggered from the Test modal are excluded from the Console log History panel, because they may be running unsaved code.`})}),`\n`,_jsx(Heading,{level:`3`,id:`run-instance-ids-in-the-logs-tab`,children:`Run instance IDs in the Logs tab`}),`\n`,_jsxs(_components.p,{children:[`The Logs tab of a workflow run displays the `,_jsx(_components.strong,{children:`node run instance ID`}),` alongside the workflow instance ID for each Script node execution. A copy button is rendered next to every instance ID. Use this to grab a node-run identifier and paste it into the Test modal’s input selector to replay the exact past run.`]}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`subworkflow-node`,children:`Subworkflow node`}),`\n`,_jsx(_components.p,{children:`The Subworkflow node allows you to modularize complex workflows by invoking other workflows as reusable subcomponents. This approach simplifies process design, promotes reuse, and simplifies maintenance.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Add a Subworkflow Node`,children:_jsxs(_components.p,{children:[`Select `,_jsx(`strong`,{children:`Start Subworkflow`}),` from the `,_jsx(`strong`,{children:`Select Next Node`}),` dropdown. Choose from workflows categorized as `,_jsx(`strong`,{children:`Local`}),` or `,_jsx(`strong`,{children:`Libraries`}),`.`]})}),_jsx(Step,{title:`Configure the Subworkflow Node`,children:_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(`strong`,{children:`Workflow Selection`}),`: Pick the workflow to invoke.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`strong`,{children:`Open`}),`: Edit the subworkflow in a new tab.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`strong`,{children:`Preview`}),`: View the workflow canvas in a popup.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`strong`,{children:`Response Key`}),`: Set a key (e.g., `,_jsx(`code`,{children:`response_key`}),`) for output.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`strong`,{children:`Input`}),`: Provide input in JSON format.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(`strong`,{children:`Output`}),`: Output is read-only JSON after execution.`]}),`\n`]})})]}),`\n`,_jsx(Heading,{level:`3`,id:`data-mapping`,children:`Data mapping`}),`\n`,_jsx(Badge,{color:`blue`,icon:`cloud`,children:`SaaS · 5.11`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Available on SaaS with FlowX.AI 5.11.`}),` This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.`]})}),`\n`,_jsxs(_components.p,{children:[`By default, a Subworkflow node forwards the whole parent context to the subworkflow and nests the result under the response key. `,_jsx(_components.strong,{children:`Data mapping`}),` lets you instead pass only selected fields into the subworkflow and land its results directly into named parent variables, using visual input and output mappers rather than raw JSON.`]}),`\n`,_jsxs(_components.p,{children:[`In the node config panel, expand `,_jsx(_components.strong,{children:`Data mapping`}),` and turn `,_jsx(_components.strong,{children:`Enable data mapping`}),` on.`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/5.9/subworkflow-data-mapping-toggle.png`,alt:`Subworkflow node config with Enable data mapping turned on, showing the Start input mapping row and an End Flow output mapping row`})})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`When data mapping is off, the node keeps its original behavior: the `,_jsx(_components.strong,{children:`Input`}),` and read-only `,_jsx(_components.strong,{children:`Output`}),` JSON fields described above. Turning `,_jsx(_components.strong,{children:`Enable data mapping`}),` on replaces those with the mappers below.`]})}),`\n`,_jsx(_components.p,{children:`When data mapping is on, the node exposes two mappers, driven by the subworkflow’s own start and end nodes:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Mapper`}),_jsx(_components.th,{children:`Helper text`}),_jsx(_components.th,{children:`Defined per`}),_jsx(_components.th,{children:`How it is labeled`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Input mapping`})}),_jsx(_components.td,{children:`Variables sent by the main workflow`}),_jsx(_components.td,{children:`The subworkflow start node`}),_jsxs(_components.td,{children:[`A single row labeled `,_jsx(_components.strong,{children:`Start`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Output mapping`})}),_jsx(_components.td,{children:`Variables received by the main workflow`}),_jsx(_components.td,{children:`Each subworkflow end node`}),_jsx(_components.td,{children:`One row per end node, labeled with the end node’s name`})]})]})]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/5.9/subworkflow-input-output-mapping-rows.png`,alt:`Input mapping and Output mapping sections on the Subworkflow node, with the input mapping helper tooltip open`})})}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Output mapping applies only to synchronous subworkflows. If the subworkflow runs asynchronously, the parent does not wait for a result, so the `,_jsx(_components.strong,{children:`Output mapping`}),` block is hidden.`]})}),`\n`,_jsx(_components.p,{children:`Each row opens a mapper modal. Use it to draw field-to-field mappings between the data models, then check the result before saving.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the mapper`,children:_jsxs(_components.p,{children:[`Click the edit icon on the `,_jsx(_components.strong,{children:`Start`}),` row (input) or on an end-node row (output).`]})}),_jsx(Step,{title:`Map fields between the two data models`,children:_jsxs(_components.p,{children:[`The modal shows the source data model on the left and the target data model in the middle. Each side is color-coded: `,_jsx(_components.strong,{children:`Project Data Model`}),` and `,_jsx(_components.strong,{children:`Workflow Data Model`}),`. Draw the field-to-field mappings, or define static values and expression scripts where a direct field match does not exist.`]})}),_jsx(Step,{title:`Test the mapping`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Test`}),` to run the current mappings and preview the produced payload in the read-only results panel on the right. Any mapping errors are highlighted so you can correct them before saving.`]})}),_jsx(Step,{title:`Apply values from a past run (optional)`,children:_jsxs(_components.p,{children:[`To test against real data, pick a previous workflow instance from `,_jsx(_components.strong,{children:`Past Instances Variables`}),` and click `,_jsx(_components.strong,{children:`Apply`}),` to load that instance’s values as the source example. Use the reset control to return to the default example values.`]})}),_jsx(Step,{title:`Save`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Save`}),` to store the mapping on the node. In committed or upper environments the modal is read-only and shows `,_jsx(_components.strong,{children:`Close`}),` instead.`]})})]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/5.9/subworkflow-data-mapping-modal.png`,alt:`Input mapping modal with the parent workflow variables on the left, mapped subworkflow fields in the middle, and the Test preview payload on the right`})})}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Data mapping keeps the subworkflow’s contract explicit: the parent passes exactly the fields the subworkflow needs, and only the mapped results flow back. This is easier to maintain than forwarding the entire context and reading everything back through the response key.`})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`Import, export, and clone`})}),`\n`,_jsx(_components.p,{children:`Subworkflow mappings are stored as part of the workflow definition, so they travel with the node when the workflow is exported, imported, or cloned.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`On upgrade, existing Subworkflow nodes keep data mapping turned `,_jsx(_components.strong,{children:`off`}),`, so they continue to behave exactly as before. Turn `,_jsx(_components.strong,{children:`Enable data mapping`}),` on per node to adopt the mappers.`]})}),`\n`,_jsx(Tip,{children:_jsx(_components.p,{children:`Use subworkflows for reusable logic such as data enrichment, validation, or external system calls.`})}),`\n`,_jsx(Heading,{level:`3`,id:`parallel-multi-instance`,children:`Parallel multi-instance`}),`\n`,_jsx(Badge,{color:`blue`,icon:`cloud`,children:`SaaS · 5.12`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Available on SaaS with FlowX.AI 5.12.`}),` This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.`]})}),`\n`,_jsxs(_components.p,{children:[`A Subworkflow node normally runs the child workflow once. Turn on `,_jsx(_components.strong,{children:`Parallel Multi-Instance`}),` to run it once for every element of an array instead, in parallel, and collect the results back into a second array.`]}),`\n`,_jsx(_components.p,{children:`This keeps fan-out inside the Integration Designer. Previously, running a workflow once per item meant wrapping it in a process and fanning out with a multi-instance Call Activity.`}),`\n`,_jsxs(_components.p,{children:[`In the node config panel, expand `,_jsx(_components.strong,{children:`Execution`}),` and turn `,_jsx(_components.strong,{children:`Parallel Multi-Instance`}),` on.`]}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/5.9/subworkflow-execution-parallel-multi-instance.png`,alt:`Execution section on the Subworkflow node with Parallel Multi-Instance turned on and Enable Data Mapping locked on, showing the required Input Array and Output Array selectors`})})}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`Turning `,_jsx(_components.strong,{children:`Parallel Multi-Instance`}),` on also turns `,_jsx(_components.strong,{children:`Enable Data Mapping`}),` on and locks it there, because each array element has to be mapped into the child workflow individually. The `,_jsx(_components.a,{href:`#data-mapping`,children:`data mapping`}),` mappers stay available and work the same way.`]})}),`\n`,_jsx(_components.p,{children:`Then set the two arrays:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Setting`}),_jsx(_components.th,{children:`Where`}),_jsx(_components.th,{children:`Required`}),_jsx(_components.th,{children:`What it does`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Input Array`})}),_jsx(_components.td,{children:`Input Mapping`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`The array of objects to iterate. One subworkflow instance starts per element.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Output Array`})}),_jsx(_components.td,{children:`Output Mapping`}),_jsx(_components.td,{children:`Yes`}),_jsx(_components.td,{children:`The array each instance’s result is collected into.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.strong,{children:`Correlation attribute`})}),_jsx(_components.td,{children:`Output Mapping`}),_jsx(_components.td,{children:`No`}),_jsx(_components.td,{children:`Decides which output array element each result updates.`})]})]})]}),`\n`,_jsx(_components.p,{children:`Only array attributes from the workflow data model can be selected, and both arrays must be arrays of objects. If a dropdown offers nothing, the workflow data model has no array attributes to choose from.`}),`\n`,_jsx(Frame,{children:_jsx(_components.p,{children:_jsx(_components.img,{src:`https://s3.eu-west-1.amazonaws.com/docx.flowx.ai/5.9/subworkflow-input-output-array-selectors.png`,alt:`Subworkflow node with the Input Array, Output Array, and Correlation attribute selectors filled with array attributes from the workflow data model`})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.strong,{children:`How results land`})}),`\n`,_jsx(_components.p,{children:`The correlation attribute behaves as an upsert key rather than a strict join:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`A result whose correlation value matches an existing element of the output array updates that element.`}),`\n`,_jsx(_components.li,{children:`A result that matches no element is appended.`}),`\n`,_jsx(_components.li,{children:`With no correlation attribute set, every result is appended.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Correlation candidates are the primitive fields of the output array’s element, so pick the output array first. Until you do, the `,_jsx(_components.strong,{children:`Correlation attribute`}),` selector stays empty.`]}),`\n`,_jsxs(_components.p,{children:[`If the merge fails, the still-running instances are cancelled and the output array is emptied. See `,_jsx(_components.a,{href:`#routing-a-subworkflow-failure`,children:`Routing a subworkflow failure`}),`.`]}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:`Point the input and output arrays at different data model attributes. Reusing one array as both the source and the target makes the upsert behavior hard to reason about.`}),_jsx(_components.p,{children:`Each instance runs the same subworkflow against one element, so if you need per-element branching, put it inside the child workflow rather than around the Subworkflow node.`})]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsxs(_components.strong,{children:[`Parallel multi-instance is not the same as `,_jsx(_components.a,{href:`#start-parallel-and-end-parallel-nodes`,children:`parallel branches`}),`.`]}),` Start Parallel and End Parallel nodes run several `,_jsx(_components.em,{children:`different`}),` branches of one workflow at the same time. Parallel multi-instance runs `,_jsx(_components.em,{children:`one`}),` subworkflow many times, once per element of an array. Use parallel branches for different work in parallel, and multi-instance for the same work over a collection.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`execution-logic-and-error-handling`,children:`Execution logic and error handling`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Parent workflow waits for subworkflow completion before proceeding.`}),`\n`,_jsxs(_components.li,{children:[`If the subworkflow fails, the parent workflow halts at this node. On SaaS (5.12), connecting the node’s failure exit routes the failure down its own branch instead. See `,_jsx(_components.a,{href:`#routing-a-subworkflow-failure`,children:`Routing a subworkflow failure`}),`.`]}),`\n`,_jsx(_components.li,{children:`Subworkflow output is available to downstream nodes via the response key.`}),`\n`,_jsx(_components.li,{children:`Logs include workflow name, instance ID, and node statuses for both parent and subworkflow.`}),`\n`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`If a subworkflow is deleted, an error displays: `,_jsx(`code`,{children:`[name] subworkflow not found.`})]})}),`\n`,_jsx(Check,{children:_jsx(_components.p,{children:`Subworkflow runs are recorded in workflow instance history for traceability.`})}),`\n`,_jsx(Heading,{level:`3`,id:`routing-a-subworkflow-failure`,children:`Routing a subworkflow failure`}),`\n`,_jsx(Badge,{color:`blue`,icon:`cloud`,children:`SaaS · 5.12`}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Available on SaaS with FlowX.AI 5.12.`}),` This feature is live on managed (SaaS) deployments now. Self-hosted deployments will receive it with the next LTS release family.`]})}),`\n`,_jsx(_components.p,{children:`A Subworkflow node has two exits, drawn as a green connector for success and a red one for failure. Connect the red exit to send a failed run down its own branch instead of stopping the parent workflow.`}),`\n`,_jsx(_components.p,{children:`This is opt-in per node. A node whose red exit is not connected fails and blocks exactly as it did before, and nothing is changed for existing workflows.`}),`\n`,_jsxs(_components.p,{children:[`Only a `,_jsx(_components.strong,{children:`mapping`}),` failure is routed, because that is the kind of failure a workflow can be built to handle: the same workflow succeeds for records that carry the right fields.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Routed down the failure exit`}),_jsx(_components.th,{children:`Still stops the workflow`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`The input mapper fails`}),_jsx(_components.td,{children:`No subworkflow is set on the node`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`The input it produced does not satisfy what the subworkflow expects`}),_jsx(_components.td,{children:`The response key is missing`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`The output mapper fails when merging the result back`}),_jsx(_components.td,{children:`The node has no mapping configured at all`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{}),_jsx(_components.td,{children:`The run hits the maximum node or subworkflow-depth limit`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`On the failure branch, the node writes a fixed `,_jsx(_components.strong,{children:_jsx(_components.code,{children:`subWorkflowError`})}),` key, separate from its response key:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Field`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`hasError`})}),_jsxs(_components.td,{children:[`Always `,_jsx(_components.code,{children:`true`}),`. It exists so a branch reads the same shape here as on other node types.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`errorMessage`})}),_jsxs(_components.td,{children:[`For example, `,_jsx(_components.code,{children:`The input of subworkflow node [name] could not be mapped, so no subworkflow was started.`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`errorType`})}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`INPUT_MAPPING`}),` or `,_jsx(_components.code,{children:`OUTPUT_MAPPING`}),`, so a branch can tell a child that never started from one that ran and could not be merged back.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`childInstanceUuid`})}),_jsx(_components.td,{children:`The run whose result could not be mapped back. Left out entirely when no child was started.`})]})]})]}),`\n`,_jsxs(Note,{children:[_jsxs(_components.p,{children:[`The failure exit covers the node’s own mapping. A subworkflow that fails `,_jsx(_components.strong,{children:`inside itself`}),` still cascades to the parent, whether or not the failure exit is connected.`]}),_jsx(_components.p,{children:`A manual single-node run also reports the error to you rather than following the branch.`})]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`On a `,_jsx(_components.a,{href:`#parallel-multi-instance`,children:`parallel multi-instance`}),` node, a merge failure cancels the sibling instances that are still running and empties the output array before taking the failure branch, so the branch never reads a half-filled list.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`console-logging-navigation-and-read-only-mode`,children:`Console logging, navigation, and read-only mode`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Console shows input/output, workflow name, and instance ID for each subworkflow run.`}),`\n`,_jsx(_components.li,{children:`Open subworkflow in a new tab for debugging from the console.`}),`\n`,_jsx(_components.li,{children:`Breadcrumbs enable navigation between parent and subworkflow details.`}),`\n`,_jsx(_components.li,{children:`In committed/upper environments, subworkflow configuration is read-only and node runs are disabled (preview/open only).`}),`\n`]}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Subworkflow instances are logged in history, and you can navigate between parent and child workflow runs for comprehensive debugging.`})}),`\n`,_jsx(Heading,{level:`3`,id:`use-case-crm-data-retrieval-with-subworkflows`,children:`Use case: CRM Data Retrieval with subworkflows`}),`\n`,_jsx(_components.p,{children:`Suppose you need to retrieve CRM details in a subworkflow and use the output for further actions in the parent workflow.`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Create the Subworkflow`,children:_jsx(_components.p,{children:`Design a workflow that connects to your CRM system, fetches user details, and outputs the data in a structured JSON format.`})}),_jsx(Step,{title:`Add a Subworkflow Node in the Parent Workflow`,children:_jsx(_components.p,{children:`In your main workflow, add a Subworkflow Node and select the CRM retrieval workflow. Map any required input parameters.`})}),_jsxs(Step,{title:`Use Subworkflow Output in Parent Workflow`,children:[_jsxs(_components.p,{children:[`Downstream nodes in the parent workflow can reference the subworkflow’s output using the defined `,_jsx(`code`,{children:`responseKey`}),`.`]}),_jsx(CodeBlock,{filename:``,numberOfLines:`3`,language:`json`,children:_jsx(_components.pre,{className:`shiki shiki-themes dark-plus dark-plus`,style:{backgroundColor:`#0B0C0E`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},language:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#9CDCFE`,\"--shiki-dark\":`#9CDCFE`},children:` \"crmData\"`}),_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CE9178`,\"--shiki-dark\":`#CE9178`},children:'\"${responseKey}\"'})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#D4D4D4`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]}),_jsx(Step,{title:`Monitor and Debug`,children:_jsx(_components.p,{children:`Use the console to view input/output data, workflow names, and instance IDs. Open subworkflow runs in new tabs for detailed debugging.`})})]}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`This modular approach allows you to build scalable, maintainable integrations by composing workflows from reusable building blocks.`})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`end-node`,children:`End node`}),`\n`,_jsx(_components.p,{children:`The End node signifies the termination of a workflow’s execution. It collects the final output and completes the workflow process.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Receives input in JSON format from the previous node.`}),`\n`,_jsx(_components.li,{children:`Output represents the final data model of the workflow.`}),`\n`,_jsx(_components.li,{children:`Multiple End nodes are allowed for different execution paths.`}),`\n`]}),`\n`,_jsx(Info,{children:_jsxs(_components.p,{children:[`If the node’s output doesn’t meet mandatory requirements, it will be flagged as an error to ensure all necessary data is included. Output parameters declared in the workflow’s output schema are a runtime contract: when any of them resolves to no value, the run fails with `,_jsx(_components.code,{children:`The mandatory output parameters of the \u003cworkflow> workflow are missing at runtime`}),` - see the `,_jsx(_components.a,{href:`/5.9/docs/resources/error-glossary#the-mandatory-output-parameters-of-the-workflow-are-missing-at-runtime`,children:`error glossary`}),`.`]})}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[`A placeholder that doesn’t resolve fails `,_jsx(_components.strong,{children:`silently`}),` on an End node: the output field is set to `,_jsx(_components.code,{children:`null`}),`, and the only error you see is the mandatory-output failure above. When mapping an End node output:`]}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Use the bare key with no prefix: `,_jsx(_components.code,{children:\"${responseKey.data}\"}),`, not `,_jsx(_components.code,{children:\"${output.value}\"}),` or `,_jsx(_components.code,{children:\"${input.responseKey.data}\"}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Check the spelling against the Response Key configured on the REST node - the response body lives under `,_jsx(_components.code,{children:`\u003cresponseKey>.data`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Leave the placeholder unquoted for numeric or boolean values; quote it (`,_jsx(_components.code,{children:'\"${key}\"'}),`) only for strings.`]}),`\n`]}),_jsx(_components.p,{children:`To confirm what an End node actually produced, open the node in the workflow run details: it shows the exact input it received and the output JSON it emitted.`})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"dark","config":{},"pageMetadata":{"title":"Workflow node reference: control flow and integration nodes","sidebarTitle":"Control flow nodes","description":"Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.","owner":"docs","last_reviewed":"2026-10-26T00:00:00.000Z","href":"/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Start node","slug":"start-node","depth":2,"children":[{"title":"External triggers","slug":"external-triggers","depth":3,"children":[]},{"title":"How do I run a workflow on a schedule?","slug":"how-do-i-run-a-workflow-on-a-schedule","depth":3,"children":[]}]},{"title":"REST API Call node","slug":"rest-api-call-node","depth":2,"children":[{"title":"When does a REST API Call node take its failure exit?","slug":"when-does-a-rest-api-call-node-take-its-failure-exit","depth":3,"children":[]}]},{"title":"FlowX database node","slug":"flowx-database-node","depth":2,"children":[]},{"title":"Condition (Fork) node","slug":"condition-fork-node","depth":2,"children":[{"title":"Available bindings","slug":"available-bindings","depth":3,"children":[]},{"title":"Condition examples","slug":"condition-examples","depth":3,"children":[]},{"title":"Calling reusable functions in conditions","slug":"calling-reusable-functions-in-conditions","depth":3,"children":[]}]},{"title":"Start Parallel and End Parallel nodes","slug":"start-parallel-and-end-parallel-nodes","depth":2,"children":[{"title":"How do I run steps in parallel?","slug":"how-do-i-run-steps-in-parallel","depth":3,"children":[]},{"title":"What data does each branch see?","slug":"what-data-does-each-branch-see","depth":3,"children":[]},{"title":"How are the branches merged?","slug":"how-are-the-branches-merged","depth":3,"children":[]},{"title":"What happens when a branch fails?","slug":"what-happens-when-a-branch-fails","depth":3,"children":[]},{"title":"Runtime view","slug":"runtime-view","depth":3,"children":[]},{"title":"Use cases","slug":"use-cases","depth":3,"children":[]},{"title":"Limitations","slug":"limitations","depth":3,"children":[]}]},{"title":"Script node","slug":"script-node","depth":2,"children":[{"title":"Calling reusable functions","slug":"calling-reusable-functions","depth":3,"children":[]},{"title":"Testing a script in isolation","slug":"testing-a-script-in-isolation","depth":3,"children":[]},{"title":"Run instance IDs in the Logs tab","slug":"run-instance-ids-in-the-logs-tab","depth":3,"children":[]}]},{"title":"Subworkflow node","slug":"subworkflow-node","depth":2,"children":[{"title":"Data mapping","slug":"data-mapping","depth":3,"children":[]},{"title":"Parallel multi-instance","slug":"parallel-multi-instance","depth":3,"children":[]},{"title":"Execution logic and error handling","slug":"execution-logic-and-error-handling","depth":3,"children":[]},{"title":"Routing a subworkflow failure","slug":"routing-a-subworkflow-failure","depth":3,"children":[]},{"title":"Console logging, navigation, and read-only mode","slug":"console-logging-navigation-and-read-only-mode","depth":3,"children":[]},{"title":"Use case: CRM Data Retrieval with subworkflows","slug":"use-case-crm-data-retrieval-with-subworkflows","depth":3,"children":[]}]},{"title":"End node","slug":"end-node","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/flowxai/9795f3937492dd76/snippets/zendesk-verification.js","/_mintlify/custom/flowxai/93d12cb97573b7cd/snippets/intro-hero.js","/_mintlify/custom/flowxai/90103fefc8b4bea0/snippets/footer-horizon.js"],"subdomain":"flowxai","siteName":"FlowX.AI","title":"Workflow node reference: control flow and integration nodes - FlowX.AI","relatedPagesConfig":{"enabled":true,"limit":5,"mode":"automatic"},"contextualStarterQuestions":[{"_id":"6ae8b68d0f74a023963739c1","deploymentId":"694954a421c35c020852b639","questionText":"What are external triggers?","status":"active","generatedBy":"contextual","path":"5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow","createdAt":"2026-11-02T16:13:01.316Z","updatedAt":"2026-11-02T16:13:01.316Z","__v":0},{"_id":"6ae8b68d0f74a023963739c2","deploymentId":"694954a421c35c020852b639","questionText":"How do I run workflows on schedule?","status":"active","generatedBy":"contextual","path":"5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow","createdAt":"2026-11-02T16:13:01.316Z","updatedAt":"2026-11-02T16:13:01.316Z","__v":0},{"_id":"6ae8b68d0f74a023963739c0","deploymentId":"694954a421c35c020852b639","questionText":"How do I configure the Start node?","status":"active","generatedBy":"contextual","path":"5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow","createdAt":"2026-11-02T16:13:01.316Z","updatedAt":"2026-11-02T16:13:01.316Z","__v":0}],"navMaps":{"firstHrefInVersion":{"v6.x":{"href":"/6.x/docs/platform-deep-dive/integrations/workflow-nodes-control-flow","matchLevel":1},"v5.9.x":{"href":"/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow","matchLevel":0},"v5.1.x":{"href":"/5.1/docs/platform-deep-dive/core-components/flowx-engine","matchLevel":2},"v4.7.x":{"href":"/4.7.x/docs/platform-deep-dive/core-components/flowx-engine","matchLevel":2},"v4.1.x":{"href":"/4.1.x/docs/platform-deep-dive/core-components/flowx-engine","matchLevel":2},"v3.x":{"href":"/3.x/docs/platform-deep-dive/core-components/flowx-engine","matchLevel":2}},"firstHrefInLanguage":{}},"lastModified":"2026-11-02T16:12:18.189Z","gitLastModified":"2026-11-02T16:11:06.000Z","originalFileLocation":"5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow.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=\"dark\"}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=\"Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.\">\u003cmeta data-mint-head name=\"application-name\" content=\"FlowX.AI\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_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/flowxai/tLAtpK66JQ6LptNv/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/flowxai/tLAtpK66JQ6LptNv/_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/flowxai/tLAtpK66JQ6LptNv/_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/flowxai/tLAtpK66JQ6LptNv/_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/flowxai/tLAtpK66JQ6LptNv/_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/flowxai/tLAtpK66JQ6LptNv/_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/flowxai/tLAtpK66JQ6LptNv/_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/flowxai/tLAtpK66JQ6LptNv/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Workflow node reference: control flow and integration nodes - FlowX.AI\">\u003cmeta data-mint-head property=\"og:description\" content=\"Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"FlowX.AI\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://flowxai.mintlify.app/_mintlify/api/og/v2?division=Integration+Designer\u0026amp;title=Workflow+node+reference%3A+control+flow+and+integration+nodes\u0026amp;description=Configure+the+Start%2C+REST+API+Call%2C+FlowX+Database%2C+Condition%2C+Start+and+End+Parallel%2C+Script%2C+Subworkflow%2C+and+End+nodes+in+Integration+Designer+workflows.\u0026amp;theme=021ad2ee1834111be160e8a7\u0026amp;signature=6bf25d955a8fa834444cb7d9b0851e4f16dfc177d2e3ef8163b4699aa75246b2\">\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=\"Workflow node reference: control flow and integration nodes - FlowX.AI\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://flowxai.mintlify.app/_mintlify/api/og/v2?division=Integration+Designer\u0026amp;title=Workflow+node+reference%3A+control+flow+and+integration+nodes\u0026amp;description=Configure+the+Start%2C+REST+API+Call%2C+FlowX+Database%2C+Condition%2C+Start+and+End+Parallel%2C+Script%2C+Subworkflow%2C+and+End+nodes+in+Integration+Designer+workflows.\u0026amp;theme=021ad2ee1834111be160e8a7\u0026amp;signature=6bf25d955a8fa834444cb7d9b0851e4f16dfc177d2e3ef8163b4699aa75246b2\">\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/flowxai/tLAtpK66JQ6LptNv/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"FlowX.AI\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#fcb813\">\u003cmeta data-mint-head name=\"zd-site-verification\" content=\"94tteg5ir5of8gkb4twzh\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.flowx.ai/#organization\",\"name\":\"FlowX.AI\",\"url\":\"https://docs.flowx.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/flowxai/38fXEM0a7v86Lg2m/logo/light.png?fit=max\u0026auto=format\u0026n=38fXEM0a7v86Lg2m\u0026q=85\u0026s=d767c06cef433b0a02f40a1f4f785eab\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.flowx.ai#website\",\"name\":\"FlowX.AI\",\"url\":\"https://docs.flowx.ai\",\"publisher\":{\"@id\":\"https://docs.flowx.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow#webpage\",\"url\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow\",\"name\":\"Workflow node reference: control flow and integration nodes\",\"description\":\"Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.\",\"dateModified\":\"2026-11-02T16:11:06.000Z\",\"isPartOf\":{\"@id\":\"https://docs.flowx.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Platform deep dive\",\"item\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/core-components/flowx-engine\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Integrations\",\"item\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/integrations-overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Integration Designer\",\"item\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/integration-designer\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Workflow node reference: control flow and integration nodes\",\"item\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow#article\",\"headline\":\"Workflow node reference: control flow and integration nodes\",\"name\":\"Workflow node reference: control flow and integration nodes\",\"description\":\"Configure the Start, REST API Call, FlowX Database, Condition, Start and End Parallel, Script, Subworkflow, and End nodes in Integration Designer workflows.\",\"url\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow\",\"mainEntityOfPage\":{\"@id\":\"https://docs.flowx.ai/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow#webpage\"},\"dateModified\":\"2026-11-02T16:11:06.000Z\",\"publisher\":{\"@id\":\"https://docs.flowx.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.flowx.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"FlowX.AI\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"FlowX.AI","nav":{"global":null,"versions":[{"version":"v6.x","tag":"Preview","pages":[{"title":"v6.x","href":"/6.x/docs/platform-deep-dive/integrations/workflow-nodes-control-flow"}]},{"version":"v5.9.x","default":true,"tag":"Latest LTS","tabs":[{"tab":"Documentation","icon":"book","groups":[{"group":"Getting Started","pages":[{"title":"FlowX.AI documentation","icon":"book-open","mode":"wide","href":"/5.9/docs/introduction"},{"title":"Tutorial: Build a credit card application","sidebarTitle":"Build your first process","icon":"rocket","href":"/5.9/docs/getting-started/building-your-first-proc"},{"title":"Tutorial: Build your first workflow","sidebarTitle":"Build your first workflow","icon":"diagram-next","href":"/5.9/docs/getting-started/building-your-first-workflow"},{"title":"Tutorial: Build your first UI Flow","sidebarTitle":"Build your first UI Flow","icon":"browser","href":"/5.9/docs/getting-started/building-your-first-ui-flow"},{"title":"Glossary","icon":"book","href":"/5.9/docs/getting-started/glossary"},{"title":"Using FlowX docs with AI assistants","icon":"robot","href":"/5.9/docs/getting-started/using-flowx-docs-with-ai"}]},{"group":"Concepts","pages":[{"title":"FlowX.AI architecture: services, layers, and data flow","sidebarTitle":"FlowX.AI architecture","icon":"diagram-project","href":"/5.9/docs/platform-overview/flowx-architecture"},{"title":"FlowX.AI data architecture: which service uses which store","sidebarTitle":"Data architecture","icon":"database","href":"/5.9/docs/platform-overview/data-architecture"},{"title":"Security","icon":"shield-check","href":"/5.9/docs/platform-overview/security"},{"title":"Intro to BPMN","icon":"diagram-project","href":"/5.9/docs/platform-overview/frameworks-and-standards/business-process-industry-standards/intro-to-bpmn"},{"group":"Infrastructure technologies","icon":"server","pages":[{"title":"Intro to Elasticsearch","href":"/5.9/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-elasticsearch"},{"title":"Intro to Kafka concepts","href":"/5.9/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-kafka-concepts"},{"title":"Intro to Kubernetes","href":"/5.9/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-kubernetes"},{"title":"Intro to NGINX","href":"/5.9/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-nginx"},{"title":"Intro to Redis","href":"/5.9/docs/platform-overview/frameworks-and-standards/event-driven-architecture-frameworks/intro-to-redis"}]}]},{"group":"FlowX.AI Designer","pages":[{"title":"FlowX.AI Designer","icon":"pen-ruler","href":"/5.9/docs/flowx-designer/overview"},{"title":"Notification center","icon":"bell","href":"/5.9/docs/flowx-designer/notification-center"},{"group":"Design Assets","icon":"pen","pages":[{"title":"Themes","href":"/5.9/docs/flowx-designer/design-assets/themes"},{"title":"Fonts","href":"/5.9/docs/flowx-designer/design-assets/font-files"},{"title":"Global Media Library","href":"/5.9/docs/flowx-designer/design-assets/global-media-library"}]},{"group":"Managing a project flow","icon":"arrow-progress","pages":[{"title":"Creating a new project","href":"/5.9/docs/flowx-designer/managing-a-project-flow/creating-a-project"},{"title":"Creating and managing process definitions","href":"/5.9/docs/flowx-designer/managing-a-project-flow/creating-a-new-process-definition"},{"title":"Adding a new node","href":"/5.9/docs/flowx-designer/managing-a-project-flow/adding-a-new-node"},{"title":"Adding an action to a node","href":"/5.9/docs/flowx-designer/managing-a-project-flow/adding-an-action-to-a-node"},{"title":"Handling decisions in the flow","href":"/5.9/docs/flowx-designer/managing-a-project-flow/handling-decisions-in-the-flow"},{"title":"Adding parallel flow branches","href":"/5.9/docs/flowx-designer/managing-a-project-flow/adding-more-flow-branches"},{"title":"Creating a user interface","href":"/5.9/docs/flowx-designer/managing-a-project-flow/creating-a-user-interface"},{"title":"Moving a token backwards in a process","href":"/5.9/docs/flowx-designer/managing-a-project-flow/moving-a-token-backwards-in-a-process"},{"title":"Exporting and importing projects","href":"/5.9/docs/flowx-designer/managing-a-project-flow/export-import-a-process-definition"},{"title":"Initiating/starting processes","href":"/5.9/docs/flowx-designer/managing-a-project-flow/starting-a-process"}]}]},{"group":"Building projects","pages":[{"title":"Workspaces","icon":"building-columns","href":"/5.9/docs/projects/workspaces"},{"title":"Resources","icon":"building-wheat","href":"/5.9/docs/projects/resources"},{"title":"Reference types in resources usage","icon":"link","href":"/5.9/docs/projects/reference-types"},{"group":"Configuration","icon":"box","pages":[{"title":"Projects","href":"/5.9/docs/projects/managing-applications/application"},{"title":"Libraries","href":"/5.9/docs/projects/managing-applications/libraries"},{"title":"Versioning","href":"/5.9/docs/projects/managing-applications/versioning"},{"title":"Checking a version for issues","icon":"triangle-exclamation","href":"/5.9/docs/projects/managing-applications/checking-for-issues"},{"title":"Dependencies","href":"/5.9/docs/projects/managing-applications/dependencies"}]},{"group":"Runtime","icon":"play","pages":[{"title":"Builds","href":"/5.9/docs/projects/runtime/builds"},{"title":"Active policy","href":"/5.9/docs/projects/runtime/active-policy"},{"title":"Configuration parameters overrides","href":"/5.9/docs/projects/runtime/configuration-parameters-overrides"},{"group":"Active process","pages":[{"title":"Process instance","href":"/5.9/docs/projects/runtime/active-process/process-instance"},{"title":"Update process variables","href":"/5.9/docs/projects/runtime/active-process/update-process-variables"},{"title":"Migrate process instances","href":"/5.9/docs/projects/runtime/active-process/migrate-process-instances"},{"title":"Move tokens","href":"/5.9/docs/projects/runtime/active-process/move-token"},{"title":"Failed process start (exceptions)","href":"/5.9/docs/projects/runtime/active-process/failed-process-start"}]},{"title":"Scheduled processes","href":"/5.9/docs/projects/runtime/scheduled-processes"},{"title":"Manage Triggers","href":"/5.9/docs/projects/runtime/manage-triggers"},{"title":"Workflow instances","icon":"diagram-project","href":"/5.9/docs/projects/runtime/workflow-instances"},{"title":"UI Flow Sessions","href":"/5.9/docs/projects/runtime/ui-flow-sessions"}]}]},{"group":"Building blocks","pages":[{"group":"Processes","icon":"network-wired","pages":[{"title":"Process Designer","href":"/5.9/docs/building-blocks/process/process"},{"title":"Process definition","href":"/5.9/docs/building-blocks/process/process-definition"},{"title":"Permission-based expressions","href":"/5.9/docs/building-blocks/process/permission-based-expressions"},{"title":"Process data model","href":"/5.9/docs/building-blocks/process/data-model"},{"title":"Data mappers","href":"/5.9/docs/building-blocks/process/data-mappers"},{"title":"Passing data between nodes","href":"/5.9/docs/building-blocks/process/passing-data-between-nodes"},{"title":"Subprocess management","href":"/5.9/docs/building-blocks/process/subprocess"},{"title":"Navigation areas","href":"/5.9/docs/building-blocks/process/navigation-areas"},{"title":"Navigation best practices","href":"/5.9/docs/building-blocks/process/navigation-best-practices"},{"title":"Process design principles","href":"/5.9/docs/building-blocks/process/design-principles"}]},{"group":"Nodes","icon":"circle-nodes","pages":[{"title":"Process nodes (BPMN)","href":"/5.9/docs/building-blocks/node/node"},{"title":"Start/end nodes","href":"/5.9/docs/building-blocks/node/start-end-node"},{"title":"Send message/receive message tasks","href":"/5.9/docs/building-blocks/node/message-send-received-task-node"},{"title":"Service Task node","href":"/5.9/docs/building-blocks/node/task-node"},{"title":"User task node","href":"/5.9/docs/building-blocks/node/user-task-node"},{"title":"Exclusive gateway","href":"/5.9/docs/building-blocks/node/exclusive-gateway-node"},{"title":"Parallel gateway","href":"/5.9/docs/building-blocks/node/parallel-gateway"},{"group":"Call subprocess tasks","pages":[{"title":"Call activity node","href":"/5.9/docs/building-blocks/node/call-subprocess-tasks/call-activity-node"},{"title":"Start embedded subprocess","href":"/5.9/docs/building-blocks/node/call-subprocess-tasks/start-embedded-subprocess"}]},{"group":"Message events","pages":[{"title":"Message Events","href":"/5.9/docs/building-blocks/node/message-events/message-events"},{"title":"Message Start Event","href":"/5.9/docs/building-blocks/node/message-events/message-catch-start-event"},{"group":"Message intermediate events","pages":[{"title":"Message intermediate events overview","href":"/5.9/docs/building-blocks/node/message-events/message-intermediate/message-intermediate"},{"title":"Message throw intermediate event","href":"/5.9/docs/building-blocks/node/message-events/message-intermediate/message-throw-intermediate-event"},{"title":"Message catch intermediate event","href":"/5.9/docs/building-blocks/node/message-events/message-intermediate/message-catch-intermediate-event"},{"title":"Intermediate message events in business processes","href":"/5.9/docs/building-blocks/node/message-events/message-intermediate/example-intermediate-message-events"}]},{"title":"Message catch boundary events","href":"/5.9/docs/building-blocks/node/message-events/message-catch-boundary-event"}]},{"group":"Timer events","pages":[{"title":"Timer events","href":"/5.9/docs/building-blocks/node/timer-events/timer-events"},{"title":"Timer start event","href":"/5.9/docs/building-blocks/node/timer-events/timer-start-event"},{"title":"Timer Intermediate Event (interrupting)","href":"/5.9/docs/building-blocks/node/timer-events/timer-intermediate-event"},{"title":"Timer boundary event","href":"/5.9/docs/building-blocks/node/timer-events/timer-boundary-event"},{"title":"Timer expressions","href":"/5.9/docs/building-blocks/node/timer-events/timer-expressions"}]},{"title":"Error events","href":"/5.9/docs/building-blocks/node/error-events"}]},{"group":"Actions","icon":"bolt","pages":[{"title":"Node actions","href":"/5.9/docs/building-blocks/actions/actions"},{"group":"Business rule actions","pages":[{"title":"Business rules types","href":"/5.9/docs/building-blocks/actions/business-rule-action/business-rule-action"},{"title":"Extracting additional data in business rules","href":"/5.9/docs/building-blocks/actions/business-rule-action/extracting-additional-data"}]},{"title":"Send data to user interface","href":"/5.9/docs/building-blocks/actions/send-data-to-user-interface"},{"title":"Upload file action","href":"/5.9/docs/building-blocks/actions/upload-file-action"},{"title":"Start subprocess action","href":"/5.9/docs/building-blocks/actions/start-subprocess-action"},{"title":"Append params to parent process","href":"/5.9/docs/building-blocks/actions/append-params-to-parent-process"},{"title":"Kafka send action","href":"/5.9/docs/building-blocks/actions/kafka-send-action"},{"title":"Start integration workflow action","href":"/5.9/docs/building-blocks/actions/start-integration-workflow"},{"title":"Start new project instance","href":"/5.9/docs/building-blocks/actions/start-new-project-instance"},{"title":"Send notification action","href":"/5.9/docs/building-blocks/actions/send-notification-action"}]},{"group":"UI Designer","icon":"paintbrush","pages":[{"title":"UI Designer","href":"/5.9/docs/building-blocks/ui-designer/ui-designer"},{"title":"Platform-specific considerations","href":"/5.9/docs/building-blocks/ui-designer/platform-considerations"},{"title":"Screen configuration guide","href":"/5.9/docs/building-blocks/ui-designer/screen-configuration-guide"},{"title":"UI Designer best practices","href":"/5.9/docs/building-blocks/ui-designer/best-practices"},{"group":"Root components","pages":[{"title":"Root Components in UI Design","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/root-components/root-components"},{"title":"Container","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/root-components/container"},{"title":"Card","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/root-components/card"},{"title":"Custom component","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/root-components/custom"},{"title":"Global Header and Footer","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/root-components/global-header-footer"}]},{"group":"Collections UI elements","pages":[{"title":"Collection","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/collection/collection"},{"title":"Collection Prototype","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/collection/collection-prototype"}]},{"group":"Form elements","pages":[{"title":"Input field","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/input-form-field"},{"title":"Text area","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/text-area"},{"title":"Single Select","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/select-form-field"},{"title":"Multi select","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/multi-select"},{"title":"Checkbox","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/checkbox-form-field"},{"title":"Radio","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/radio-form-field"},{"title":"Switch","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/switch-form-field"},{"title":"Datepicker","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/datepicker-form-field"},{"title":"Slider","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/slider"},{"title":"Segmented button","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/form-elements/segmented-button"}]},{"title":"Buttons","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/buttons"},{"title":"Multiple file upload","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/multiple-file-upload"},{"title":"File preview","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/file-preview"},{"title":"File download","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/file-download"},{"title":"Table","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/table"},{"title":"Image","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/image"},{"title":"Indicators","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/indicators"},{"title":"Typography","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/typography"},{"title":"Chat","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/chat"},{"title":"Markdown","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/markdown"},{"title":"Separator","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/separator"},{"title":"Progress bar","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/progress-bar"},{"title":"Tooltip","href":"/5.9/docs/building-blocks/ui-designer/ui-component-types/tooltip"},{"title":"Event Handlers","href":"/5.9/docs/building-blocks/ui-designer/event-handlers"},{"title":"Validators","href":"/5.9/docs/building-blocks/ui-designer/validators"},{"title":"Dynamic \u0026 computed values","href":"/5.9/docs/building-blocks/ui-designer/dynamic-and-computed-values"},{"title":"Localization and internationalization","href":"/5.9/docs/building-blocks/ui-designer/localization-and-i18n"},{"title":"Layout configuration","href":"/5.9/docs/building-blocks/ui-designer/layout-configuration"},{"title":"Conditional styling","href":"/5.9/docs/building-blocks/ui-designer/conditional-styling"}]},{"title":"UI Flows","icon":"file-pen","href":"/5.9/docs/building-blocks/ui-flows"},{"title":"Combine UI Flows, processes, and workflows","sidebarTitle":"Combine UI Flows, processes, and workflows","icon":"diagram-project","href":"/5.9/docs/building-blocks/combining-ui-flows-processes-and-workflows"},{"title":"Project data model","icon":"square-binary","href":"/5.9/docs/building-blocks/project-data-model"},{"title":"Token","icon":"coins","href":"/5.9/docs/building-blocks/token"},{"title":"Supported scripts","icon":"file-code","href":"/5.9/docs/building-blocks/supported-scripts"},{"group":"Reusable resources","icon":"puzzle-piece","pages":[{"title":"Reusable Functions","href":"/5.9/docs/building-blocks/reusable-resources/reusable-functions"},{"title":"Reusable UI Templates","href":"/5.9/docs/building-blocks/reusable-resources/reusable-ui"},{"title":"Custom Components","href":"/5.9/docs/building-blocks/reusable-resources/custom-components"}]}]},{"group":"Platform deep dive","pages":[{"group":"Core components","icon":"puzzle","pages":[{"title":"FlowX.AI Engine","href":"/5.9/docs/platform-deep-dive/core-components/flowx-engine"},{"title":"FlowX.AI Advancing Controller","href":"/5.9/docs/platform-deep-dive/core-components/advancing-controller"},{"title":"FlowX.AI Events Gateway","href":"/5.9/docs/platform-deep-dive/core-components/events-gateway"}]},{"group":"Core extensions","icon":"puzzle-piece","pages":[{"group":"Content management","pages":[{"title":"FlowX.AI CMS","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/content-management"},{"title":"Enumerations","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/enumerations"},{"title":"Substitution tags","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/substitution-tags"},{"title":"Media library","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/media-library"},{"group":"Document Templates","pages":[{"title":"Document Templates","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/documents-plugin-overview"},{"title":"Generating documents","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/generating-from-html-templates"},{"title":"Managing templates","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/managing-html-templates"},{"title":"Creating and uploading a new document","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/uploading-a-new-document"},{"title":"Converting files","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/converting-documents-to-different-formats"},{"title":"Splitting documents","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/splitting-a-document"},{"title":"Combining files","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/combining-files"},{"title":"Deleting files","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/deleting-a-file"},{"title":"Getting URLs","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/getting-urls-to-documents"},{"title":"Listing stored files","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/listing-stored-files"},{"title":"Encrypting and decrypting files","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/documents-plugin/encrypting-decrypting-files"}]},{"group":"Notification Templates","pages":[{"title":"Notification Templates","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/notifications-plugin-overview"},{"title":"Managing notification templates","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/managing-notification-templates"},{"title":"Sending a notification","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/sending-a-notification"},{"title":"Sending an email","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/sending-an-email-with-attachments"},{"title":"Forwarding notifications","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/forwarding-notifications-to-an-external-system"},{"group":"OTP flow","pages":[{"title":"Handling OTP","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/otp-flow/otp-flow"},{"title":"Generate OTP","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/otp-flow/generate-otp"},{"title":"Validate OTP","href":"/5.9/docs/platform-deep-dive/core-extensions/content-management/notifications-plugin/otp-flow/validate-otp"}]}]}]},{"group":"Task management","pages":[{"title":"Task management","href":"/5.9/docs/platform-deep-dive/core-extensions/task-management/task-management-overview"},{"title":"Task Management localization","href":"/5.9/docs/platform-deep-dive/core-extensions/task-management/task-management-localization"},{"title":"Using allocation rules","href":"/5.9/docs/platform-deep-dive/core-extensions/task-management/using-allocation-rules"},{"title":"Using out of office records","href":"/5.9/docs/platform-deep-dive/core-extensions/task-management/using-out-of-office-records"},{"title":"Using stages","href":"/5.9/docs/platform-deep-dive/core-extensions/task-management/using-stages"}]},{"title":"Configuration parameters","href":"/5.9/docs/platform-deep-dive/core-extensions/configuration-parameters"},{"title":"FlowX.AI Audit","href":"/5.9/docs/platform-deep-dive/core-extensions/audit"},{"title":"FlowX.AI Scheduler","href":"/5.9/docs/platform-deep-dive/core-extensions/scheduler"},{"title":"FlowX.AI Data Search","href":"/5.9/docs/platform-deep-dive/core-extensions/search-data-service"}]},{"group":"Plugins","icon":"puzzle-piece-simple","pages":[{"title":"FlowX custom plugins","href":"/5.9/docs/platform-deep-dive/plugins/custom-plugins"},{"title":"OCR plugin","href":"/5.9/docs/platform-deep-dive/plugins/custom-plugins/ocr-plugin"},{"group":"Reporting plugin","pages":[{"title":"Reporting plugin","href":"/5.9/docs/platform-deep-dive/plugins/custom-plugins/reporting/reporting-overview"},{"title":"Authorization \u0026 access roles","href":"/5.9/docs/platform-deep-dive/plugins/custom-plugins/reporting/access-and-authorization"}]},{"title":"WYSIWYG editor","href":"/5.9/docs/platform-deep-dive/plugins/wysiwyg"}]},{"group":"Integrations","icon":"link","pages":[{"title":"Choose how to connect FlowX.AI to external systems","sidebarTitle":"Overview","href":"/5.9/docs/platform-deep-dive/integrations/integrations-overview"},{"title":"Consuming FlowX from external apps","href":"/5.9/docs/platform-deep-dive/integrations/consuming-flowx-from-external-apps"},{"title":"Finding identifiers and parameters","href":"/5.9/docs/platform-deep-dive/integrations/finding-identifiers-and-parameters"},{"group":"Integration Designer","pages":[{"title":"Integration Designer","href":"/5.9/docs/platform-deep-dive/integrations/integration-designer"},{"title":"Data sources and endpoints in Integration Designer","sidebarTitle":"Data sources and endpoints","href":"/5.9/docs/platform-deep-dive/integrations/data-sources-and-endpoints"},{"title":"Send and receive files with Integration Designer endpoints","sidebarTitle":"File handling","href":"/5.9/docs/platform-deep-dive/integrations/endpoint-file-handling"},{"title":"Create and run workflows in Integration Designer","sidebarTitle":"Workflows","description":"Choose between a workflow, process, or UI Flow, then create a workflow, define its data model, reference workflow data in nodes, and run or stop it.","href":"/5.9/docs/platform-deep-dive/integrations/integration-workflows"},{"title":"Workflow node reference: control flow and integration nodes","sidebarTitle":"Control flow nodes","href":"/5.9/docs/platform-deep-dive/integrations/workflow-nodes-control-flow"},{"title":"Workflow node reference: data, document, and AI nodes","sidebarTitle":"Data and AI nodes","description":"Configure workflow nodes that parse and generate tabular files, fill templates, send notifications, merge or split PDFs, retrieve context, and run AI agents.","href":"/5.9/docs/platform-deep-dive/integrations/workflow-nodes-data-and-ai"},{"title":"Workflow data model","href":"/5.9/docs/platform-deep-dive/integrations/workflow-data-models"},{"title":"Custom Agent node","href":"/5.9/docs/platform-deep-dive/integrations/custom-agent-node"},{"title":"Deep Research node","href":"/5.9/docs/platform-deep-dive/integrations/deep-research-node"},{"title":"Document classifiers","href":"/5.9/docs/platform-deep-dive/integrations/document-classifiers"},{"title":"Proxy connections","href":"/5.9/docs/platform-deep-dive/integrations/proxy-connections"},{"group":"MCP Integration","pages":[{"title":"MCP integration","href":"/5.9/docs/platform-deep-dive/integrations/mcp-integration/mcp-integration-overview"},{"title":"MCP Data Sources","href":"/5.9/docs/platform-deep-dive/integrations/mcp-integration/adding-mcp-data-source"}]},{"group":"Knowledge Base Integration","pages":[{"title":"Knowledge Base integration","href":"/5.9/docs/platform-deep-dive/integrations/knowledge-base-integration/knowledge-base-overview"},{"title":"Managing stores","href":"/5.9/docs/platform-deep-dive/integrations/knowledge-base-integration/managing-content"},{"title":"Using Knowledge Base in workflows","href":"/5.9/docs/platform-deep-dive/integrations/knowledge-base-integration/using-knowledge-base-in-workflows"},{"title":"Testing a knowledge base","href":"/5.9/docs/platform-deep-dive/integrations/knowledge-base-integration/testing-knowledge-base"}]}]},{"group":"Data sources","pages":[{"title":"FlowX Database","href":"/5.9/docs/platform-deep-dive/integrations/flowx-database"},{"title":"Unmanaged MongoDB","href":"/5.9/docs/platform-deep-dive/integrations/unmanaged-mongodb"},{"title":"Oracle Database","href":"/5.9/docs/platform-deep-dive/integrations/oracle-database"},{"title":"PostgreSQL Database","href":"/5.9/docs/platform-deep-dive/integrations/postgresql-database"},{"title":"Db2 Database","href":"/5.9/docs/platform-deep-dive/integrations/db2-database"},{"title":"Testing data sources from Runtime","href":"/5.9/docs/platform-deep-dive/integrations/testing-data-sources"},{"title":"SOAP System","href":"/5.9/docs/platform-deep-dive/integrations/soap-system"},{"title":"File Storage","href":"/5.9/docs/platform-deep-dive/integrations/file-storage"},{"title":"Email Trigger","href":"/5.9/docs/platform-deep-dive/integrations/email-trigger"},{"title":"Email Sender","href":"/5.9/docs/platform-deep-dive/integrations/email-sender"},{"title":"Microsoft Outlook","href":"/5.9/docs/platform-deep-dive/integrations/microsoft-outlook-data-source"},{"title":"Incoming Webhooks","href":"/5.9/docs/platform-deep-dive/integrations/incoming-webhooks"}]},{"group":"Custom integrations","pages":[{"title":"Building a connector","href":"/5.9/docs/platform-deep-dive/integrations/building-a-connector"},{"title":"Creating a Kafka consumer","href":"/5.9/docs/platform-deep-dive/integrations/creating-a-kafka-consumer"},{"title":"Creating a Kafka producer","href":"/5.9/docs/platform-deep-dive/integrations/creating-a-kafka-producer"}]},{"group":"Testing \u0026 monitoring","pages":[{"title":"Mock integrations","href":"/5.9/docs/platform-deep-dive/integrations/mock-integrations"},{"title":"Observability with OpenTelemetry","href":"/5.9/docs/platform-deep-dive/integrations/open-telemetry"}]}]},{"title":"Third-party components","icon":"cube","href":"/5.9/docs/platform-deep-dive/third-party-components"},{"title":"Accessibility","icon":"universal-access","href":"/5.9/docs/platform-deep-dive/accessibility"},{"group":"User roles management","icon":"user","pages":[{"title":"Swimlanes","href":"/5.9/docs/platform-deep-dive/user-roles-management/swimlanes"},{"title":"Business filters","href":"/5.9/docs/platform-deep-dive/user-roles-management/business-filters"},{"title":"Anonymous runtime access","href":"/5.9/docs/platform-deep-dive/user-roles-management/anonymous-runtime-access"}]}]},{"group":"Resources","pages":[{"title":"Error glossary","icon":"circle-exclamation","href":"/5.9/docs/resources/error-glossary"}]},{"group":"API reference","pages":[{"group":"Start processes","pages":[{"title":"Get Build Info","api":"GET https://admin.devmain.flowxai.dev/rtm/api/runtime/wks/{workspaceId}/app/{appId}/build/info","href":"/5.9/docs/api/start-process/get-build-info"},{"title":"Get build info by process instance","api":"GET {BASE_URL}/api/runtime/process-instance/{processInstanceUuid}/build/info","href":"/5.9/docs/api/start-process/build-info-by-process-instance"},{"title":"Get build info by UI flow session","api":"GET {BASE_URL}/api/runtime/ui-flow-session/{uiFlowSessionUuid}/build/info","href":"/5.9/docs/api/start-process/build-info-by-ui-flow-session"},{"title":"Start process by workspace, app, and process name","api":"POST {BASE_URL}/api/runtime/wks/{workspaceId}/app/{appId}/process-name/{processName}/start","href":"/5.9/docs/api/start-process/start-by-process-name"},{"title":"Start process by build id and process name","api":"POST https://admin.devmain.flowxai.dev/rtm/api/runtime/app/{appId}/build/{buildId}/process-name/{processDefinitionName}/start","href":"/5.9/docs/api/start-process/rest2"},{"title":"Start process and copy data from another instance","api":"POST {BASE_URL}/api/runtime/wks/{workspaceId}/app/{appId}/process-name/{processName}/start/copyDataFrom/{processInstanceId}","href":"/5.9/docs/api/start-process/start-with-copy-data"},{"title":"Start process from UI with resource definition and inherit values","api":"POST {BASE_URL}/api/runtime/wks/{workspaceId}/app/{appId}/rdi/{resourceDefinitionId}/start/inherit-from/{processInstanceId}","href":"/5.9/docs/api/start-process/start-process-rdi-inherit"}]},{"group":"Mocks","pages":[{"title":"Add new Kafka exchange mock","api":"POST {MOCK_ADAPTER_URL}/api/kafka-exchanges/","href":"/5.9/docs/api/mocks/add-kafka-mock"},{"title":"View Kafka Exchanges","api":"GET {MOCK_ADAPTER_URL}/api/kafka-exchanges","href":"/5.9/docs/api/mocks/view-kafka-exchanges"}]},{"group":"Storage","pages":[{"title":"List storage buckets","api":"GET {{documentUrl}}/internal/storage/buckets","href":"/5.9/docs/api/storage/list-buckets"},{"title":"List objects in a bucket","api":"GET {{documentURL}}/internal/storage/buckets/{BUCKET_NAME}","href":"/5.9/docs/api/storage/list-objects-in-buckets"},{"title":"Download a file","api":"GET documentURL/internal/storage/download","href":"/5.9/docs/api/storage/download-file"}]},{"title":"Clear cache","api":"POST {{baseUrlAdmin}}/api/internal/cache/clear","href":"/5.9/docs/api/clear-cache"},{"title":"Force platform rescan","api":"GET {baseUrl}/api/platform/discover","href":"/5.9/docs/api/force-rescan"},{"title":"MCP API Reference","href":"/5.9/docs/api/mcp-api-reference"}]}]},{"tab":"AI Platform","icon":"robot","pages":[{"title":"AI Platform","href":"/5.9/ai-platform/ai-in-flowx"}]},{"tab":"SDKs","icon":"code","pages":[{"title":"SDKs","href":"/5.9/sdks/sdks-overview"}]},{"tab":"Release notes","icon":"newspaper","pages":[{"title":"Release notes","href":"/release-notes/overview"}]},{"tab":"Cookbooks","icon":"utensils","pages":[{"title":"Cookbooks","href":"/5.9/cookbooks/overview"}]},{"tab":"Observatory","icon":"telescope","pages":[{"title":"Observatory","href":"/5.9/observatory/overview"}]},{"tab":"FlowX SaaS","icon":"cloud","pages":[{"title":"FlowX SaaS","href":"/5.9/docs/saas/saas-overview"}]},{"tab":"Setup guides","icon":"screwdriver-wrench","pages":[{"title":"Setup guides","href":"/5.9/setup-guides/migrate-to-flowx-ai-helm-chart"}]},{"tab":"Migrating from 5.1 LTS","icon":"route","pages":[{"title":"Migrating from 5.1 LTS","href":"/5.9/migrating-from-5.1-lts/overview"}]}]},{"version":"v5.1.x","tag":"LTS","pages":[{"title":"v5.1.x","href":"/5.1/docs/platform-deep-dive/core-components/flowx-engine"}]},{"version":"v4.7.x","tag":"Legacy","pages":[{"title":"v4.7.x","href":"/4.7.x/docs/platform-deep-dive/core-components/flowx-engine"}]},{"version":"v4.1.x","tag":"Legacy","pages":[{"title":"v4.1.x","href":"/4.1.x/docs/platform-deep-dive/core-components/flowx-engine"}]},{"version":"v3.x","tag":"Legacy","pages":[{"title":"v3.x","href":"/3.x/docs/platform-deep-dive/core-components/flowx-engine"}]}]},"basePath":"","title":"Workflow node reference: control flow and integration nodes - FlowX.AI","buildId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","deploymentId":"dpl_DeHjVRGfFnhYQwHnfC2pjeXXv8h9","dynamics":["10e4515597","07c022d89b","a74be98ba7"],"chunks":["BannerMarkdown-CX_qQQOL.js","dist-BTZUMDnx.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-xpJZXxdP.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js","Frame-DXXFP6nH.js","DynamicMarkdown-B54_zNBF.js","zoom-image-lightbox-BG6oD64b.js","lightbox-handle-r17bVUz3.js"]}