Skip to main content

Did you know?

Unlike Postman, which focuses on API testing, the Integration Designer automates workflows between systems. With drag-and-drop ease, it handles REST API connections, real-time processes, and error management, making integrations scalable and maintainable.

Overview

Integration Designer facilitates the integration of the FlowX platform with external systems, applications, and data sources.
Build one: Build your first workflow walks through a REST data source, a workflow that calls it, and a process that starts the workflow.
Integration Designer supports multiple data source types including RESTful Systems, FlowX Database, MCP Integration, Knowledge Base, Email Trigger, Email Sender, and Microsoft Outlook.
Integration resources (data sources, workflows, systems) are versioned as part of your project version, not individually. Changes are tracked in the project’s Resources Changed view. To view the change history for a specific integration resource, right-click it and select View History.

Key features

1

Drag-and-Drop Simplicity

You can build complex API workflows using a drag-and-drop interface, making it accessible for both technical and non-technical audience.
2

Visual REST API Integration

Specifically tailored for creating and managing REST API calls through a visual interface, streamlining the integration process without the need for extensive coding.
3

Real-Time Testing and Validation

Allows for immediate testing and validation of REST API calls within the design interface.

Managing integration endpoints

Data Sources

A data source is a collection of resources—endpoints, authentication, and variables—used to define and run integration workflows.

Creating a new data source definition

With Data Sources feature you can create, update, and organize endpoints used in API integrations. These endpoints are integral to building workflows within the Integration Designer, offering flexibility and ease of use for managing connections between systems. Endpoints can be configured, tested, and reused across multiple workflows, streamlining the integration process. Go to the Data Sources section in FlowX Designer at Workspaces -> Your workspace -> Projects -> Your project -> Integrations -> Data Sources.
The data sources resource page uses a tile-based creation flow and a unified details view.
  • Creation modal: clicking New Data Source opens a modal where each connector type appears as its own tile with an icon. Use the search box to filter tiles by name. Pick a tile, give the data source a name, and click Create to open the configuration page.
  • List view: each entry shows the connector’s icon and type. Use the type filter at the top to scope the list to a specific connector (REST, FlowX Database, Email, MCP Server, Knowledge Base, etc.).
  • Unified settings layout: every data source type now uses the same card-based settings layout, so the configuration experience is consistent across connectors.
  • Save with incomplete configuration: you can create and save a data source even when some fields (credentials, endpoints) are not yet available. The data source can be referenced in workflows and processes immediately, but it will only operate at runtime once required fields are filled in.

Data sources types

There are multiple types of data sources available:

RESTful System

Connect to external REST APIs. Configure endpoints, authentication, and parameters for HTTP-based integrations. Detailed in this document below.

SOAP System

Connect to SOAP web services by importing a WSDL and invoking the discovered operations from workflows.

FlowX Database

Store and retrieve structured data within FlowX using MongoDB collections. Share data across processes without external dependencies.

Unmanaged MongoDB

Connect to externally managed MongoDB instances. Use your existing MongoDB infrastructure with the same CRUD operations as FlowX Database.

Oracle Database

Connect to independently managed Oracle databases and run saved SQL queries from workflows.

PostgreSQL Database

Connect to independently managed PostgreSQL databases and run saved SQL queries from workflows.

Db2 Database

Connect to independently managed IBM Db2 databases and run saved SQL queries from workflows.

MCP Integration

Connect Model Context Protocol servers to enable AI agents to use external tools, databases, and services.

FlowX Knowledge Base

AI-powered contextual knowledge repositories for intelligent document search and retrieval in workflows.

Email Trigger

Start process instances automatically when emails are received. Connect to IMAP servers and monitor mailboxes for event-driven automation.

Email Sender

Configure SMTP connections to send emails directly from processes, including replies to received emails.

Incoming Webhook

Trigger processes from external systems via HTTP POST requests with API key authentication.

RESTful System

Add a New Data Source, set the data source’s unique code, name, and description:
  • Select Data Source: RESTful System
  • Name: The data source’s name.
  • Code: A unique identifier for the external data source.
  • Base URL: The base URL is the main address of a website or web application, typically consisting of the protocol (http or https), domain name, and a path.
  • Description: A description of the data source and its purpose.
  • Enable enumeration value mapping: If checked, this system will be listed under the mapped enumerations. See enumerations section for more details.
To dynamically adjust the base URL based on the upper environment (e.g., dev, QA, stage), you can use environment variables and configuration parameters. For example: https://api.${environment}.example.com/v1.Additionally, keep in mind that the priority for determining the configuration parameter (e.g., base URL) follows this order: first, input from the user/process; second, configuration parameters overrides (set directly on FlowX.AI designer or environment variables); and lastly, configuration parameters.
  1. Set up authorization (Service Token, Bearer Token, or No Auth). In our example, we will set the auth type as a bearer and we will set it at system level:
The value of the token might change depending on the environment so it is recommended to define it at system level and apply Configuration Parameters Overrides at runtime.

Defining REST integration endpoints

In this section you can define REST API endpoints that can be reused across different workflows.
  1. Under the Endpoints section, add the necessary endpoints for system integration.
  1. Configure an endpoint by filling in the following properties:
    • Method: GET, POST, PUT, PATCH, DELETE.
    • Path: Path for the endpoint.
    • Parameters: Path, query, and header parameters.
    • Content type (POST endpoints): JSON, Raw, Multipart/Form-Data, or Binary.
    • Response: JSON or Single binary file.
    • Response example: Body or headers.
Sending non-JSON text bodies (XML, SOAP, plain text, application/x-www-form-urlencoded): set the Content type to Raw. The body is sent as-is, and FlowX preserves the Content-Type you set in the endpoint’s request Headers rather than forcing one. (Earlier releases offered only JSON, Multipart/form-data, or Binary, so these payloads had to be wrapped as multipart.)For OAuth token endpoints that expect a form-urlencoded payload (e.g. client_credentials or password grant), prefer configuring the data source’s Authorization settings instead of building the call by hand — FlowX handles the token request internally and applies the resulting access token to subsequent calls.

REST endpoint caching

For GET endpoints, you can configure response caching to reduce redundant API calls, avoid rate limits, and lower operational costs. When data is stable for a defined period, caching eliminates unnecessary external API calls and improves workflow performance.

Configuring cache Time-To-Live (TTL)

Choose between two TTL policies based on your use case:
Cache responses for a specific duration after each request.Configuration Options:
  • ISO Duration: Use ISO 8601 duration format
    • PT1H - Cache for 1 hour
    • PT30M - Cache for 30 minutes
    • P1D - Cache for 1 day
    • P1W - Cache for 1 week
  • Dynamic Duration: Reference configuration parameters using ${myConfigParam}
  • Default: R/P1D (1 day)
Use Case: Ideal when you want consistent cache duration regardless of time of day.Example: Cache country list for 24 hours after each request

Cache visibility and management

Testing Modal
When testing endpoints, you can view:
  • Cache Status: Whether results came from cache (hit) or external API (miss)
  • Cache Key: Unique identifier for the cached response
  • TTL Information: When the cache will expire
    • Duration-based: “Expires after PT10M” (10 minutes)
    • Time-based: “Expires at 23:00 on 2025-11-04”
Workflow Console Monitor cache usage during workflow execution with the same detailed information visible in logs.
Clear Cache Manually invalidate cached responses when needed:
  • Available in the endpoint testing modal
  • Available from the endpoint definition page
  • Only visible when caching is configured
Clear cache after updating data in the external system to ensure workflows fetch fresh data on the next request.

How caching works

1

First Request

When a GET endpoint is called for the first time, FlowX.AI:
  1. Calls the external API
  2. Stores the response in cache with the configured TTL
  3. Returns the response to the workflow
2

Subsequent Requests

If the cache is still valid (within TTL):
  1. FlowX.AI returns the cached response immediately
  2. No external API call is made
  3. Response time is significantly faster
3

Cache Expiration

Once the TTL expires:
  1. Next request fetches fresh data from the external API
  2. Cache is updated with the new response
  3. New TTL period begins

Error handling

Reliability First: If any issue occurs with cache retrieval or storage, FlowX.AI automatically falls back to calling the external API directly. Your workflows always receive correct data.
Automatic fallback scenarios:
  • Cache service unavailable → Direct API call
  • Cache corruption or invalid data → Direct API call
  • Cache storage failure → Direct API call (with warning logged)

Use cases

Reference Data

Cache country lists, product catalogs, currency rates, or other reference data that changes infrequently

Rate Limit Compliance

Stay within third-party API rate limits by reducing the number of requests

Cost Optimization

Lower operational costs by reducing billable API calls to external services

Performance

Improve workflow execution speed by eliminating network latency for cached responses
Example: An e-commerce platform caches product catalog data for 1 hour. With 1000 workflow executions per hour, caching reduces API calls from 1000 to just 1, saving 999 external calls while ensuring data freshness every hour.

SQL operation caching

SQL data source operations support response caching with the same TTL policies as REST endpoints. On a SQL operation’s details page, open the Response Caching section and toggle Caching Enabled, then choose a return policy (Expires After duration or Expires At time-based), exactly as for REST GET endpoints above. A Clear cache button invalidates cached responses on demand. Caching is governed by three platform-wide settings on the integration-designer service:
Per-operation caching only takes effect when FLOWX_SQL_CACHE_ENABLED is true. If an operation has caching enabled while the global switch is off, the query runs live and a warning is logged.

Extended response caching

Response caching extends beyond GET REST endpoints and SQL operations to cover POST endpoints, Mongo read operations, and file storage read operations. These surfaces reuse the same TTL policies, Clear cache control, and automatic fallback behavior described above.

POST endpoint caching

You can enable response caching on POST endpoints as well as GET endpoints. For a POST endpoint, the request body is part of the cache key, so calls to the same URL with different bodies are cached as separate entries and never return one another’s response. GET requests carry no body, so their cache keys are unchanged.

Mongo read caching

Database data source caching also applies to Mongo read operations: FIND, FIND_ONE, and AGGREGATE, alongside the SQL queries already covered above. Mutating operations (for example inserts, updates, and deletes) cannot be cached. Enable caching per operation in the Response Caching section of the operation’s details page, exactly as for SQL operations. The same payload-size and duration caps apply to both SQL and Mongo caching.

File operation caching

File storage data source operations support response caching with the same TTL policies and controls as REST endpoints and database operations. Caching applies to read operations only: On a LIST or DOWNLOAD operation’s details page, open the Response Caching section, toggle Caching Enabled, and choose a return policy (Expires After duration or Expires At time-based). A Clear cache button invalidates cached responses on demand, exactly as for REST endpoints and database operations.
For a DOWNLOAD, FlowX caches the document reference rather than the file content. On a cache hit, the workflow receives a fresh document created from the retained copy, so the read from remote storage is skipped while your workflow still gets a valid document to work with.

Defining variables

The Variables tab allows you to store system-specific variables that can be referenced throughout workflows using the format ${variableName}. These declared variables can be utilized not only in workflows but also in other sections, such as the Endpoint or Authorization tabs.
For example:
  • For our integration example, you can declare configuration parameters and use the variables to store your tableId and baseId and reference them the Variables tab.
  • Use variables in the Base URL to switch between different environments, such as UAT or production.

Endpoint parameter types

When configuring endpoints, several parameter types help define how the endpoint interacts with external systems. These parameters ensure that requests are properly formatted and data is correctly passed.

Path parameters

Elements embedded directly within the URL path of an API request that acts as a placeholder for specific value.
  • Used to specify variable parts of the endpoint URL.
  • Defined with ${parameter} format.
  • Mandatory in the request URL.
Path parameters must always be included, while query and header parameters are optional but can be set as required based on the endpoint’s design.

Query parameters

Query parameters are added to the end of a URL to provide extra information to a web server when making requests.
  • Query parameters are appended to the URL after a ? symbol and are typically used for filtering or pagination (for example, ?search=value)
  • Useful for filtering or pagination.
  • Example URL with query parameters: https://api.example.com/users?search=johndoe&page=2.
These parameters must be defined in the Parameters table, not directly in the endpoint path.
URL encoding option
Each query parameter has an Encode option that controls whether the value is URL-encoded before being sent:
  • Encode enabled: The system automatically URL-encodes the parameter value (special characters like spaces, &, = are converted to their encoded equivalents like %20, %26, %3D)
  • Encode disabled (default): The value is sent as-is, allowing you to provide pre-encoded values
Use the Encode option when your parameter values may contain special characters that need encoding. Disable it if you’re already providing URL-encoded values or if the external API expects raw values.
To preview how query parameters are sent in the request, you can use the Preview feature to see the exact request in cURL format. This shows the complete URL, including query parameters.

Header parameters

Used to give information about the request and to give instructions to the API of how to handle the request
  • Header parameters (HTTP headers) provide extra details about the request or its message body.
  • They are not part of the URL. Default values can be set for testing and overridden in the workflow.
  • Custom headers sent with the request (for example, Authorization: Bearer token).
  • Define metadata or authorization details.

Body parameters

The data sent to the server when an API request is made.
  • These are the data fields included in the body of a request, usually in JSON format.
  • Body parameters are used in POST, PUT, and PATCH requests to send data to the external system (for example, creating or updating a resource).

Response body parameters

The data sent back from the server after an API request is made.
  • These parameters are part of the response returned by the external system after a request is processed. They contain the data that the system sends back.
  • Typically returned in GET, POST, PUT, and PATCH requests. Response body parameters provide details about the result of the request (for example, confirmation of resource creation, or data retrieval)

Enum mapper

The enum mapper for the request body enables you to configure enumerations for specific keys in the request body, aligning them with values from the External System or translations into another language.
On enumerations you can map both translation values from different languages or values for different source systems.
Make sure you have the enumerations created with corresponding translations and system values in your application already:
Select whether to use in the integration the enumeration value corresponding to the External System or the translation into another language.For translating into language a header parameter called ‘Language’ is required to specify the language for translation.

Configuring authorization

  • Select the required Authorization Type from a predefined list.
  • Enter the relevant details based on the selected type (for example, Realm and Client ID for Service Accounts).
  • These details will be automatically included in the request headers when the integration is executed.

Authorization methods

The Integration Designer supports several authorization methods, allowing you to configure the security settings for API calls. Depending on the external system’s requirements, you can choose one of the following authorization formats:

Service account

Service Account authentication requires the following key fields:
  • Identity Provider Url: The URL for the identity provider responsible for authenticating the service account.
  • Client Id: The unique identifier for the client within the realm.
  • Client secret: A secure secret used to authenticate the client alongside the Client ID.
  • Scope: Specifies the access level or permissions for the service account.
When using Entra as an authentication solution, the Scope parameter is mandatory. Ensure it is defined correctly in the authorization settings.

Basic authentication

  • Requires the following credentials:
    • Username: The account’s username.
    • Password: The account’s password.
      • Suitable for systems that rely on simple username/password combinations for access.

Bearer

  • Requires an Access Token to be included in the request headers.
  • Commonly used for OAuth 2.0 implementations.
  • Header Configuration: Use the format Authorization: Bearer {access_token} in headers of requests needing authentication.
  • System-Level Example: You can store the Bearer token at the system level, as shown in the example below, ensuring it’s applied automatically to future API calls:
Store tokens in a configuration parameter so updates propagate across all requests when tokens are refreshed or changed.

Certificates

The Certificates panel in the Settings of a REST data source has two independent parts. Trust decides what the certificate the host presents is checked against. Identity is the client certificate FlowX presents back to the host (mutual TLS), which most hosts don’t ask for. When to use what Trust Under Verify the host’s certificate against, select one option:
None (insecure) removes protection against man-in-the-middle attacks, because the call can no longer tell the intended host from anything that intercepts it. Use it only for trusted internal hosts you control, and keep System CAs or Custom CA everywhere else.
The trust setting belongs to a single data source, so changing it for one connector leaves every other call verified as before. None (insecure) is accepted only by REST and File Storage data sources. Identity Toggle Present a certificate ON to send a client certificate when the host asks for one, then fill in the certificate fields below. Leave it OFF when the host doesn’t use mutual TLS. Certificate fields Custom CA and Present a certificate each take one certificate, with these fields: A PEM certificate for Custom CA is a public certificate, so it takes no password.
Path points to the filesystem of the Integration Designer service, not to your local machine: the file must be mounted into the service container (for example, through a Kubernetes secret and volume mount). On SaaS deployments, use Inline.
All fields support ${configParam} placeholders for dynamic per-environment resolution.
Use Configuration Parameters Overrides to manage certificate content and passwords across environments (Dev, UAT, Production) without changing the data source configuration. For example, store the certificate content in a config parameter and reference it with ${clientCertificate}.
Preparing the files PEM files work as you receive them: use the CA certificate (for example ca.crt) for Custom CA, and the client certificate and its key (client.crt and client.key) for Present a certificate. No keytool or openssl step is needed. To use PKCS12 instead, package a PEM certificate and its key as a keystore:
For Inline with PKCS12 or JKS, encode the file and paste the output into Certificate content, or store it in a configuration parameter:
What happens to certificate settings from earlier versions? Data sources saved before FlowX.AI 6.0 are converted automatically, and so are imported exports from earlier versions: Exporting for 5.9.x When you export for the 5.9.x LTS line in Target platform version, certificate settings are written in the format 5.9.x reads. The export stops with an error that names the data source (System '<name>' cannot be exported to this FlowX version, which does not support ...) when a data source uses something 5.9.x can’t store:
  • a Custom CA without a client certificate
  • a PEM certificate
  • a CA and a client certificate in different formats, or one Inline and the other Path
Change the certificates of that data source, or export for the current version. For the export options, see Cross-version export and import.

File handling

You can now handle file uploads and downloads with external systems directly within Integration Designer. This update introduces native support for file transfers in RESTful connectors, reducing the need for custom development and complex workarounds.
Important: Document replacement behaviorWhen saving files to the Document Plugin, if you upload a file with the same customId AND documentType combination as an existing document, the previous document will be automatically marked as deleted and replaced by the new file.This means:
  • The previous file’s URLs will stop working
  • Only the most recent file with that customId + documentType combination will be accessible
Best practices:
  • Always use unique, dynamic values for customId (for example, ${processInstanceId}, ${clientId}, ${uuid})
  • Never copy examples with hardcoded values like customId: "1234" or documentType: "BULK" without changing them
  • If you need to store multiple documents of the same type, ensure each has a unique customId
Example: Using dynamic customId

Core scenarios

Integration Designer supports two primary file handling scenarios:
1

Downloading Files

Can call an external API (GET or POST) and receives a response containing one or more files. Integration Designer saves these files to a specified location and returns their new paths to the workflow for further processing.
2

Uploading Files

Can send a file that is already stored in the Document Plugin or a custom S3 Bucket to an external API via a POST request. The workflow transmits the file path, enabling file transfer without manual handling.
Common use cases include contract generation workflows where data is sent to external document services and the generated files are retrieved back into the process.

Receiving XML and SOAP responses

Available starting with FlowX.AI 5.9.0Earlier releases assumed every response body was JSON — any other format failed the node even on a valid 2xx. From 5.9.0, the engine honours the content type the endpoint declares and parses XML responses automatically.
REST endpoints can consume JSON, XML (including SOAP envelopes), and plain text responses. You don’t pick the response format in a dropdown — the engine resolves it from the endpoint’s request Headers:
  1. The Accept header wins (what the integration expects back).
  2. If Accept is absent, the request Content-Type is used as a fallback.
  3. If neither is set, the engine runs in automatic mode and infers the format from the upstream’s response Content-Type.
  4. Wildcard Accept values (*/*, application/*, text/*) are treated as automatic — they don’t commit to a format.
Media types are categorised as follows: When an XML or SOAP response is parsed, you map its fields exactly like a JSON response (for example ${response.body.Envelope.Body.result}). The original XML is preserved alongside the parsed object, so flows that need the raw markup can still access it.
The engine fails the node with a clear error when the response does not match what the endpoint declared:
  • Content type mismatch — declared application/json but the upstream returned text/plain: Expected response content type "application/json" but received "text/plain".
  • Parse failure on a declared type — declared XML but the body is malformed: Response declared as XML but could not be parsed as XML.
In automatic mode (or when XML was only inferred from the upstream’s Content-Type), a parse failure does not fail the node — the raw string is returned instead, so a mislabelled upstream doesn’t break the flow.
XML parsing is XXE-safe: external entity resolution and DTD processing are disabled, so XXE and entity-expansion payloads cannot read local files or exhaust memory. XML bodies larger than 5 MiB are returned as raw strings without parsing.
To send a SOAP or XML request body, set the endpoint Content type to Raw and add the matching Content-Type header — see Defining REST integration endpoints above.

Receiving files (endpoint response configuration)

To configure an endpoint to handle incoming files from an external system, navigate to its Response tab. This functionality is available for both GET and POST methods.

Enabling and configuring file downloads

1

Activate File Processing

Switch the Save Files toggle to the “on” position to activate file processing for the response.
If this toggle is off, the system doesn’t save files. The response body reaches the workflow as a raw string, whether it holds Base64 data or the binary file itself, and the node succeeds. The node fails only when the endpoint’s request headers declare an Accept type (or, without one, a Content-Type) of JSON, XML, or text and the response is a different type. The error reads Expected response content type "…" but received "…".
2

Configure Content-Type

Select the expected format of the successful API response from the Content-Type dropdown:
  • JSON (Default): For responses containing Base64 encoded file data
  • Single Binary: For responses where the body is the file itself

Handling JSON content-type

This option is used when the API returns a JSON object containing one or more Base64 encoded files. File Destination Configuration:
Saves files to the platform’s managed storage, linking them to a specific process instance. The Document Plugin acts as a wrapper over the file system and provides special integration capabilities with document templates.
string
required
The ID of the process instance. This field defaults to ${processInstanceId} to be mapped dynamically at runtime.
When using Document Plugin for file operations, you typically send only the document reference (ID) rather than the entire file content. The Integration Designer handles the special integration with document templates automatically.
Files Mapping Table:
The Translate or Convert Enumeration Values toggle can be used in conjunction with the Save Files feature.

Handling Single Binary content-type

This option is used when the entire API response body is the file itself. The Single Binary content-type is ideal for endpoints that return raw file data directly in the response body.
1

Configure Content-Type

In the Response tab of your endpoint configuration:
  1. Enable the Save Files toggle
  2. Select Single Binary from the Content-Type dropdown
With the Save Files toggle off, a binary response isn’t saved as a file: the body reaches the workflow as a raw string. Turn Save Files on to store the file.
2

Choose File Destination

Select your preferred file storage destination:
For files stored in custom S3 buckets, ideal for files not tied to specific process instances.
3

Configure File Name Identification

Choose how the system should identify the filename from the response.
File Name Identification Methods:
File Destination Configuration:
For files managed within FlowX’s document system with full process integration:
string
required
Fallback filename if header extraction fails
string
required
Business context folder (e.g., client ID, case number)
string
required
Document classification for the Document Plugin
Files stored via Document Plugin are automatically linked to process instances and can be used with document templates and other FlowX document features.
Configuration Examples:

Sending files (endpoint POST body configuration)

To configure an endpoint to send a file, navigate to the Body tab and select the appropriate Content Type.

Content Type: Multipart/Form-data

Use this to send files and text fields in a single request. This format is flexible and can handle mixed content types within the same POST request.
1

Configure File Source

Select where the file originates:
  • Document Plugin
  • S3 Protocol
2

Define Form Parts

Add rows to the resource table, defining each part of the form:
  • Key Type: Choose File or Text
  • Value:
    • For files: Provide the filePath (Minio path for S3 or Document Plugin reference)
    • For text: Provide the string value or variable reference
Multipart requests can be sent even without files - you can include only text fields by setting all Key Types to Text. The difference between content types is primarily in how data is packaged for transmission to the target server.

Content Type: Single binary

Use this to send the raw file as the entire request body. This method sends only the file content without any additional form data or metadata.
string
required
Select Document Plugin or S3 Protocol
string
required
Specify the path of the file to be sent (Minio path for the file location)
When using Single Binary, only the Minio path is required since the entire request body will be the file content itself, without any additional packaging or metadata.

Content Type: JSON

Use this option for standard JSON payloads. To send a file as the whole request body or as a form part, use Single Binary or Multipart/Form-Data.
Available starting with FlowX.AI 5.9.6A JSON body can carry a file from the Document Plugin as a base64 string. In 5.9.5 and earlier, a JSON body cannot carry a file: use Multipart/Form-Data or Single Binary.
To embed a file, set a string value in the JSON body to @@base64File(<path>), where <path> is the file’s path in the Document Plugin. When the node runs, the marker is replaced with the file content encoded as base64:
  • The path can come from a workflow variable, such as ${filePath} from an earlier node. Variables are resolved before the marker is read.
  • Only string values are replaced. A marker used as a JSON key is left as it is.
  • The file content is added only to the request that is sent. The saved request body and the generated curl command keep the marker.
  • Downloading the file from the Document Plugin is cancelled after 5 minutes by default. On self-hosted deployments, change the limit with FLOWX_DOCUMENTPLUGIN_DOWNLOADTIMEOUT (see the Integration Designer setup guide).

Runtime behavior & testing

Workflow node configuration

All configured file settings (for example, File Path, Folder, Process Instance ID) are exposed as parameters on the corresponding workflow nodes, allowing them to be set dynamically using process variables at runtime.

Response payload & logging

When a node successfully downloads and saves a file, its output will contain the filePath to the stored file, not the raw Base64 string or binary content.
For security and performance, runtime logs will also only contain the filePath, not the raw file content.

Error handling

If a node is configured to receive a Single Binary file but the external system returns a JSON error (for example, file not found), the JSON error will be correctly passed through to the workflow for handling. If Save Files is on with the JSON content type (Base64 files) and the external system returns a success status (2xx) with a response that isn’t JSON or XML, the node fails with Unsupported content type "text/html". Make sure system is configured correctly. (the message names the content type actually received). The external system’s response causes this error, not the endpoint configuration. Error status (non-2xx), starting with FlowX.AI 5.9.6: the node keeps the response body as text, with its status code, for both JSON (Base64 files) and Single Binary. Nothing is saved as a file, and the error response isn’t stored in the endpoint response cache. The status code then drives the node: with Allow Retry on, a 408, 429, 500, 502, 503, or 504 is retried, and once retries are done the node completes with the error status, so a failure path on the node can handle it. For example, an HTML 504 Gateway Timeout page from a gateway or proxy is now retried instead of failing the workflow. Error status on 5.9.5 and earlier: with JSON (Base64 files), an HTML error page fails the node, for example Content type 'text/html' not supported for bodyType=com.fasterxml.jackson.databind.JsonNode. Changing the request Accept header doesn’t help, because the upstream gateway decides the response format. To avoid the gateway’s error page, set the node’s Timeout on its Settings tab (default 10000 ms) lower than the gateway’s timeout. The node then stops waiting before the gateway responds and returns a 408 status, which is retried when Allow Retry is on. Switching the response to Single Binary doesn’t avoid the problem on these versions: Single Binary doesn’t check the status code, so an HTML error page is saved as a file.

Testing guidelines

The Test Modal is context-aware. It will only display input fields for file parameters (Process Instance ID, Folder, etc.) if Save Files is enabled on the endpoint.
If you test an endpoint that returns a binary file without configuring it as Single Binary, the test will fail with the error: “Endpoint returns a binary file. Please configure the Content-Type to handle binary responses.”
The Response Example tab is now separate from the Response configuration tab and includes both Body and Headers sections for better clarity.

Example: sending files to an external system after uploading a file to the Document Plugin

In this example, we’ll send a file to an external system using the Integration Designer.
1

Upload a file to the Document Plugin

Configure a process where you will upload a file to the Document Plugin.
  • Configure a User Task node where you will upload the file to the Document Plugin.
  • Configure an Upload File Action node to upload the file to the Document Plugin.
  • Configure a Save Data Action node to save the file to the Document Plugin.
2

Configure the Integration Designer

Configure the Integration Designer to send the file to an external system:
  • Configure a REST API Call node to send the file to an external system.

Workflows

A workflow defines a series of tasks and processes to automate system integrations. Within the Integration Designer, workflows can be configured using different components to ensure efficient data exchange and process orchestration.

Workflow, process, or UI Flow: which one do I use?

Use a workflow to call external systems and transform data, a process to run a multi-step business journey that keeps state, and a UI Flow to show screens that don’t need a process behind them. A workflow is not a BPMN process: it is a separate resource built here, in the Integration Designer. The three are often combined, for example a process or a UI Flow starts a workflow to fetch data and uses the result. A quick test: if a step waits for a person or must remember data between steps, use a process. If it only fetches, sends, or transforms data, use a workflow. If it only shows screens and starts other resources, use a UI Flow. To start a workflow from a process, use the Start Integration Workflow action. To start one from a UI Flow, see When to use Start Workflow vs Start Process. For the UI Flow side of the choice, see When to use UI Flows. For a worked example that connects all three, see Combine UI Flows, processes, and workflows.

Creating a workflow

  1. Navigate to Workflow Designer:
    • In FlowX.AI Designer to Projects -> Your application -> Integrations -> Workflows.
    • Create a New Workflow, provide a name and description, and save it.
  2. Start to design your workflow by adding nodes to represent the steps of your workflow:
  • Start Node: Defines where the workflow begins and also defines the input parameter for subsequent nodes.
  • REST API Call nodes: Add REST API calls for fetching or sending data.
  • FlowX Database nodes: Read and write data to FlowX Database collections.
  • Custom Agent nodes: Enable AI agents to use MCP tools for intelligent task automation.
  • Intent Classification Agent nodes: Classify user messages using AI and route the workflow to the matching intent branch.
  • Context Retrieval nodes: Perform RAG searches against Knowledge Bases to retrieve relevant chunks without calling an LLM.
  • Start Parallel and End Parallel nodes: Run several branches of the workflow at the same time and merge their results when all branches finish.
  • Fork nodes (conditions): Add conditional logic for decision-making.
  • Data mapping nodes (scripts): Write custom scripts in JavaScript or Python.
  • Subworkflow nodes: Invoke other workflows as reusable components.
  • Navigate in UI Flow nodes: Navigate users to specific UI Flow screens from chat-driven workflows, passing dynamic parameters.
  • Web Page Extractor nodes: Crawl web pages, follow links up to a configurable depth, and extract content for use in workflows or Knowledge Bases.
  • End Nodes: Capture output data as the completed workflow result, ensuring the process concludes with all required information.
  • Update Knowledge Base: Update the Knowledge Base with the results of the workflow.

How do I auto-arrange the workflow canvas?

Click Auto-arrange in the bottom-right corner of the canvas, above the zoom controls, to lay out every node of the workflow from left to right, starting from the Start node. Nothing is saved until you apply the new layout.
1

Open the layout preview

Click Auto-arrange. The canvas shows the proposed layout, and the Layout preview bar says how many nodes move. While the preview is open, the canvas is read-only.
2

Compare the layouts

Switch between Show current and Show preview to compare the existing layout with the proposed one.
3

Apply or cancel

Click Apply (or press Enter) to save the new node positions, or Cancel (or press Escape) to keep the current layout.
  • Auto-arrange always arranges the whole workflow, not a selection.
  • There is no undo after you apply a layout, so compare the two layouts first.
  • If the workflow changes after the preview is built, Apply becomes Refresh preview.
  • The button is unavailable when the workflow is read-only, for example when you don’t have edit rights or while a running instance is shown on the canvas.
The process editor has the same control, labeled Arrange, with the same layout preview.

Workflow nodes overview

Workflow nodes are the building blocks of your integration logic. Each node type serves a specific function, allowing you to design, automate, and orchestrate complex processes visually.

Workflow data models

Workflow Data Models bring structured data management to Integration Designer workflows, enabling you to define input and output parameters at the workflow level, similar to Process Data Models.

Key benefits

Automatic Input Management

Input parameters automatically pre-fill the Start Node from the data model—no manual JSON editing

Consistent Data Lineage

Ensure data consistency across processes and workflows with structured data models

Type Safety

Define data types and validation rules at the workflow level for runtime safety

Better Integration

Map data bidirectionally between processes and workflows using data mappers

Quick start

1

Define Data Model

Create entities and attributes for your workflow data structure
2

Configure Input Parameters

Select which attributes will be workflow input parameters
3

Automatic Pre-fill

Start Node is automatically populated with structured data from your data model
4

Map to Processes

Use data mappers to pass data between processes and workflows

Complete Workflow Data Models Guide

Learn how to create workflow data models, configure input/output parameters, and integrate with processes

Referencing workflow data in node configurations

Node configuration fields (file paths, messages, request payloads) reference workflow data with ${...} expressions:
Array indexing is not supported in ${...} expressions. A reference like ${uploadedFiles[0].filePath} does not resolve, and the node fails with The placeholder uploadedFiles[0].filePath has no value set! even when the value is visible in the node’s Input tab. The error means the syntax cannot resolve, not that the data is missing.
To use one element of an array, extract it with a Script node first, then reference the extracted value with dot navigation:
The next node can then reference ${firstFile.filePath}. This applies to every array, including the uploadedFiles array that chat file uploads deliver to a chat-driven workflow.

Start node

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.

External triggers

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.
Start node with External Triggers enabled, a webhook data source selected, and the Start payload showing the webhookMessage schema
External triggers are available on Output Focused workflows only. Configuring one on another workflow type is rejected.
To run a workflow on a schedule, add a schedule to its Start node. See How do I run a workflow on a schedule?.
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:
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.
Manage Triggers listing webhook triggers with their state and the resources each is used in
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

How do I run a workflow on a schedule?

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? 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: 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.

REST API Call node

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 The node failed and has no outgoing sequence for a failed run. The error’s cause shows the response the call got. 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.

FlowX database node

Allows you to read and write data to the FlowX Database within your workflow.

FlowX Database Documentation

Learn more about FlowX Database operations, collections, and usage

Tabular Data Extraction node

Reads a CSV or spreadsheet file and returns its rows as structured JSON, so extracted data can drive conditions, script logic, and data operations downstream. Available under Tools in the workflow node palette. Configuration:
  • Use Test File — toggles where the file comes from. OFF: provide File Path, the download path of a file available at run time (for example, produced by a previous node or a file upload); supports ${} expressions. ON: select an uploaded test file — useful while building and testing the workflow
  • Sheet (Excel only) — the sheet name to extract from; leave empty to use the first sheet
  • Response Key — where the node writes its output; the extracted rows are stored under <responseKey>.data
Supported files: CSV, XLS, and XLSX, up to 15 MB for test-file uploads. Each row becomes a JSON object keyed by the header row (the file’s first row), with every value returned as a string. For a file with columns id, name, and role and response key rows:
The node outputs data, not a file — its result cannot be passed to the file-manipulation nodes (Combine Files, Split File). To extract structured data from unstructured documents such as PDFs or images, use the Extract Data from File AI node instead.
If extraction fails (missing file, unknown sheet name, or an unsupported format), an error object is returned on the same key. An empty file returns an empty data array.

Data Parse: XML and JSON support

The node appears in the Tools palette as Data Parse, described as “Parse CSV, spreadsheet, XML or JSON files into structured JSON.” Workflows that already use the node keep working: the node type and its configuration fields are unchanged.
  • Accepted files: CSV, XLS, XLSX, and XLSM spreadsheets, plus XML and JSON files. Test file uploads are still capped at 15 MB. Uploaded XML and JSON test files are listed with the Structured Data type.
  • Sheet: applies to Excel files only (.xls, .xlsx, .xlsm) and is ignored for CSV, XML, and JSON.
  • Output: always under <responseKey>.data. Spreadsheets return rows as described above. XML and JSON files return an object tree.
  • Size and depth limits: XML and JSON files are parsed up to 5 MB. XML nested deeper than 64 levels is rejected.
A JSON file is returned as it is, once the node has checked that it holds a single well-formed JSON document. An XML file is converted with these rules:
  • The root element is unwrapped: data holds its content, not an object keyed by the root name.
  • An element with only text becomes a string. An empty element becomes an empty string.
  • Attributes become keys. When an element has both attributes and text, the text is stored under value.
  • Sibling elements with the same name become an array. A single occurrence stays an object, so plan for both shapes when the count can vary.
  • Namespaces are dropped and only local names are kept. All values are strings.
  • Document type definitions (DTDs) and external entities are not processed.
For this file and response key customers:
the node returns:
A file downloaded by a File Storage Operation node can be parsed too. Its format is recognized from the file name, so keep the extension (for example, .xml or .json) on the stored file. Malformed XML or JSON, a file over the size limit, or XML nested too deeply makes the node run fail with an error message.

Generate Tabular File node

Turns workflow data into a CSV or XLSX file and stores it as a document linked to the current workflow run, so a workflow can produce an export without a Script node. Available under Tools in the workflow node palette. Configuration:
  • File name: the name of the generated file, up to 255 characters; supports ${} expressions (for example, ${reportDate}). The extension is added from Format, so a typed .csv, .xlsx, or .xls extension is replaced. The characters \ / : * ? " < > | are replaced with _.
  • Document Tag (optional): the tag stored on the generated document; supports ${} expressions. When left empty, the file name without its extension is used.
  • Format: CSV (default) or XLSX.
  • Row format: the shape of each row in Data.
    • Arrays (default): each row is a list of values, such as ["FP-1001", "Closed"]. The first row is the header row, and each following row is written in the same column order.
    • Objects: each row is an object, such as {"invoice": "FP-1001", "status": "Closed"}. The keys become the column headers, in the order they first appear. A missing key leaves the cell empty.
  • Data: a single workflow variable that holds the rows, such as ${data} or ${dbResult.sheets}. The variable must resolve to an array; inline JSON is not accepted.
  • Response Key: where the node writes the generated file’s metadata.
For a ${employees} variable set to:
with Row format set to Objects, Format set to CSV, File name set to team-export, and response key export, the node writes a CSV file with the columns id, name, and role, and returns:
rowCount counts data rows only, never the header row, and fileSize is in bytes. The generated file also appears in the Document tab of the run’s console log. How values are written:
  • CSV files are UTF-8 encoded with a byte order mark, so spreadsheet apps read non-ASCII characters correctly. XLSX files have a single sheet named Sheet1, and numbers and booleans keep their type.
  • Text that starts with =, +, -, @, a tab, or a carriage return is written as text, never as a formula.
  • In Arrays mode, a row shorter than the header row is padded with empty cells, and extra values become extra columns with an empty header.
  • Rows with no values are left out. An empty array still produces a file, with rowCount set to 0.
Limits: an XLSX file holds up to 1,048,576 rows, including the header row. A generated file can be up to 50 MB. The node run fails with an error message in the run log when Data is not mapped, is not a single variable reference, or does not resolve to an array; when a row does not match the selected Row format; when File name or Document Tag references a variable that has no value; or when the file exceeds a limit. Reduce the number of rows or split the export across several nodes to stay under the limits.

Template Filling node

Generates a document from a document template populated with workflow data. Available under Tools in the workflow node palette. Configuration:
  • Template — select a document template defined in your project’s Document templates; Open template jumps to the template definition
  • Language — enabled once a template is selected, and defaults to the template’s first available language
  • Template Variables — click Configure Variables to fill the template’s data-model variables with values from the workflow; changing the template resets the language and variables
  • Input Mapping — new nodes map workflow data onto the template’s input parameters in the data mapper (Configure mapping on the Template Input card) instead of Template Variables. Nodes created before FlowX.AI 5.13 show an Enable data mapping toggle: on uses the data mapper, off keeps Template Variables
  • Folder — optional folder for the generated file; supports ${} expressions (e.g., ${client.id})
  • Document Tag — the tag under which the generated document is stored (e.g., ContractTemplate)
  • Document format — PDF (default) or DOCX
The node writes the generation result to its response key, including the file ID, storage and download paths, document tag, and page count. If generation fails, an error object is returned on the same key. To map a Script node’s output into the template, fix a node that shows no mapping options, or build the download URL from downloadPath, see Fill a document template from a workflow and download it.

Managing document templates

Learn how to create and manage the document templates this node fills

Send Notification node

Sends a notification built from one of your project’s notification templates, directly from a workflow. Available under Tools in the workflow node palette. Until now this took a round trip through a process: the workflow had no way to reach the Notifications plugin on its own. Configuration:
  • Template — the notification template to send, from your project’s notification templates; Open notification template jumps to its definition. Language unlocks once a template is picked. Variables fills the template’s data-model variables from workflow data, the same mapping as the Template Filling node.
  • Recipients — To (required), Cc and Bcc. Each takes a recipient address, a JSON array of addresses, or a ${} expression resolving to either.
  • Email options — all optional: Subject override (leave empty to use the template subject), Sender name and Sender email, Attachments (one file path or ${} key per line), and Custom headers, which must be a JSON object or a ${} expression that resolves to one.

When does a Send Notification node take its failure exit?

A Send Notification node has a success exit and a failure exit. It takes the success exit only when the Notifications plugin accepts the message with a 2xx response. Everything else takes the failure exit:
  • A configuration problem caught before sending, such as no template or language, an empty To after ${} expressions resolve, an attachment given as a URL instead of a file path, or custom headers that aren’t valid JSON
  • The Notifications plugin rejecting the message
  • An authorization error (401 or 403)
  • The plugin being unreachable, timing out, or answering with a 5xx
If the node fails and the failure exit isn’t connected, the workflow instance fails with Workflow is missing outgoing sequences. It doesn’t fall through to the success exit. On both exits the node writes its result under its response key: sent, hasError, errorType, errorMessage, template (name and ID), language, recipients (to, cc, and bcc counts), and metadata.statusCode. errorType is VALIDATION (caught before sending), DELIVERY (rejected by the plugin), AUTH, or TRANSPORT. metadata is absent for VALIDATION and TRANSPORT, because no status code reached the node.

Managing notification templates

Learn how to create and manage the notification templates this node sends

Combine Files node

Merges multiple PDF files into a single output file, in the order you specify. Available under Tools in the workflow node palette. Configuration:
  • Files — add two or more source files, each by path (or a test file). Set the order and choose which pages to include per file: All pages or a custom page range.
  • Folder — optional folder for the combined file; supports ${} expressions.
  • Document Tag — the tag under which the combined file is stored.
Each input must be a PDF of up to 15 MB, and at least two files are required. The node writes the combined file’s ID and paths to its response key.

Split File node

Splits a single PDF into multiple output files — by page ranges or one file per page. Available under Tools in the workflow node palette. Configuration:
  • Source file — the PDF to split, by path (or a test file).
  • Output files — define each output by its pages using a range grammar such as 1-3,5, or a ${} expression that resolves to one at runtime. Each output can set its own Folder and Document Tag.
The source must be a PDF of up to 15 MB. The node writes the resulting files’ IDs and paths to its response key.

Context Retrieval node

Retrieves relevant data from Knowledge Bases or conversation memory using semantic and keyword search. Available under Data Operations in the workflow node palette. Configuration:
  • Source — choose between Knowledge Base or Memory (Memory is available only in chat-driven workflows)
  • Knowledge Base — select a Knowledge Base to search (when source is Knowledge Base)
  • User Query — the search query, supports process variable expressions (e.g., ${userMessage})
  • Search Type — Hybrid (default), Semantic, or Keywords
  • Max Number of Chunks — how many chunks to return (1-10, default: 5)
  • Min Relevance Score — minimum relevance threshold (0-100%, default: 70%)
  • Metadata Filters — filter chunks by metadata properties using the query builder: typed operators per key type and AND/OR grouping
  • Use advance metadata filters — toggle to enable expression-based filtering for complex logic
  • Use Re-rank — toggle to re-rank retrieved chunks before returning

Using Knowledge Base in Workflows

Learn how to configure Context Retrieval and Custom Agent nodes with Knowledge Bases

Custom Agent node

Enables AI agents to perform intelligent, autonomous tasks using Model Context Protocol (MCP) tools within your workflow. Custom Agent nodes apply ReAct (Reasoning and Acting) to decide which tools to use and execute multi-step operations. Key capabilities:
  • Access external systems through MCP servers
  • Execute complex, multi-step operations autonomously
  • Make intelligent decisions based on available tools
  • Return structured responses for downstream processing
Use cases:
  • Customer support automation with CRM integration
  • Data analysis across multiple systems
  • Dynamic integration orchestration
  • Autonomous problem-solving workflows

Custom Agent Node Documentation

Learn how to configure Custom Agent nodes, write effective prompts, and monitor AI agent execution

Intent Classification Agent node

Classifies user messages using an LLM and automatically routes the workflow to the matching intent branch — combining AI classification and conditional branching in a single node. Works like a Condition (Fork) node, but uses natural language intent descriptions instead of code expressions. Key capabilities:
  • Define up to 10 intents as plain-text descriptions
  • Automatic “If No Intent Matches” fallback branch
  • Optional conversation memory for context-aware classification
  • Optional rationale output explaining the classification decision
Common use cases:
  • Chatbot message routing
  • Email triage and classification
  • Customer support ticket categorization

Intent Classification Agent Documentation

Learn how to configure intents, output format, and routing behavior

Context Retrieval node

Performs a RAG (Retrieval-Augmented Generation) search against a Knowledge Base and returns relevant chunks — without calling an LLM. Use this node when you need to retrieve information from a Knowledge Base and pass it to downstream nodes for further processing. Key capabilities:
  • Query Knowledge Bases using semantic, keyword, or hybrid search
  • Configure relevance thresholds and result limits
  • Apply property-based filters to narrow results
  • Optional re-ranking for improved result quality
  • Returns structured chunk data (content, metadata, relevance score, store)
Common use cases:
  • Feeding context into a downstream Custom Agent or Text Generation node
  • Building multi-step RAG pipelines with custom processing between retrieval and generation
  • Retrieving relevant documentation chunks for further analysis

Context Retrieval Documentation

Learn how to configure Context Retrieval nodes, search types, and output format

AI Nodes

AI nodes enable intelligent processing of text, documents, images, and data directly within your Integration Designer workflows.
AI Nodes

AI Text Operations

AI Document Operations

AI Image Operations

AI Data Operations

AI Node Types

Learn more about AI node types and configuration options

Personal Information Guard

Personal Information Guard detects and redacts PII on AI workflow nodes before the payload reaches the model, and restores it in the response. It is configured per node (sensitivity preset, input/output scan direction, entity types) and runs in the fail-closed data-privacy service. For the full reference — configuration, scan flow, supported entity types, and run-log fields — see Personal Information Guard.

Condition (Fork) node

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.

Available bindings

Condition expressions have access to the following data bindings:

Condition examples

For details on the securityDetails and applicationConfiguration structure, see Extracting additional data in business rules.

Calling reusable functions in conditions

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:
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.

Start Parallel and End Parallel nodes

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.

How do I run steps in parallel?

1

Add a Start Parallel node

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.

What data does each branch see?

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.

How are the branches merged?

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.

What happens when a branch fails?

  • 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.

Runtime view

  • Start Parallel node: the Input tab shows the data handed to the branches.
  • End Parallel node: the Output tab shows the merged result of all branches.
  • Path grouping: the nodes of each branch are grouped by path, so you can follow one branch at a time.
  • Path time: sum of the execution times of the nodes in that branch.
  • End Parallel time: the node’s own processing time plus the longest path time.
  • Example: if branch A takes 2s and branch B takes 5s, the End Parallel node completes after 5s plus its own processing time.

Use cases

Multiple API calls

Call several independent APIs at once instead of one after the other.

Data enrichment

Fetch data from several sources in parallel and combine it afterwards.

Notification broadcasting

Send notifications through several channels (email, SMS, push) at the same time.

Document processing

Process different document types or sections in parallel.

Limitations

  • 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.

Script node

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.

Calling reusable functions

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:
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.

Testing a script in isolation

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:
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.

Run instance IDs in the Logs tab

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.

Subworkflow node

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.
  • Input: Provide input in JSON format.
  • Output: Output is read-only JSON after execution.

Data mapping

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.
Subworkflow node config with Enable data mapping turned on, showing the Start input mapping row and an End Flow output mapping row
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:
Input mapping and Output mapping sections on the Subworkflow node, with the input mapping helper tooltip open
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.
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
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 clone Subworkflow 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.

Parallel multi-instance

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.
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
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: 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.
Subworkflow node with the Input Array, Output Array, and Correlation attribute selectors filled with array attributes from the workflow data model
How results land The 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.

Execution logic and error handling

  • Parent workflow waits for subworkflow completion before proceeding.
  • If the subworkflow fails, the parent workflow halts at this node. 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.

Routing a subworkflow failure

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. On the failure branch, the node writes a fixed subWorkflowError key, separate from its response key:
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.

Console logging, navigation, and read-only mode

  • Console shows input/output, workflow name, and instance ID for each subworkflow run.
  • Open subworkflow in a new tab for debugging from the console.
  • Breadcrumbs enable navigation between parent and subworkflow details.
  • In committed/upper environments, subworkflow configuration is read-only and node runs are disabled (preview/open only).
Subworkflow instances are logged in history, and you can navigate between parent and child workflow runs for comprehensive debugging.

Use case: CRM Data Retrieval with subworkflows

Suppose you need to retrieve CRM details in a subworkflow and use the output for further actions in the parent workflow.
1

Create the Subworkflow

Design a workflow that connects to your CRM system, fetches user details, and outputs the data in a structured JSON format.
2

Add a Subworkflow Node in the Parent Workflow

In your main workflow, add a Subworkflow Node and select the CRM retrieval workflow. Map any required input parameters.
3

Use Subworkflow Output in Parent Workflow

Downstream nodes in the parent workflow can reference the subworkflow’s output using the defined responseKey.
4

Monitor and Debug

Use the console to view input/output data, workflow names, and instance IDs. Open subworkflow runs in new tabs for detailed debugging.
This modular approach allows you to build scalable, maintainable integrations by composing workflows from reusable building blocks.

End node

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.

Running and stopping workflows

You can run a workflow directly from the editor to test and debug it, and stop it while it is running.
  • Run Workflow: Click Run Workflow in the workflow editor toolbar to start a new workflow instance. You can provide start data in JSON format before running.
  • Stop Run: While a workflow instance is running, the button changes to Stop Run. Click it to cancel the instance. All in-progress and scheduled nodes are marked as cancelled.
Workflow instances can have the following statuses:

Integration with external systems

This example demonstrates how to integrate FlowX with an external system, in this example, using Airtable, to manage and update user credit status data. It walks through the setup of a data source, defining API endpoints, creating workflows, and linking them to BPMN processes in FlowX Designer.
Before going through this example of integration, we recommend:

Integration in FlowX.AI

1

Define a Data Source

Navigate to the Integration Designer and create a new data source:
  • Name: Airtable Credit Data
  • Base URL: https://api.airtable.com/v0/
2

Define Endpoints

In the Endpoints section, add the necessary API endpoints for system integration:
  1. Get Records Endpoint:
    • Method: GET
    • Path: /${baseId}/${tableId}
    • Path Parameters: Add the values for the baseId and for the tableId so they will be available in the path.
    • Header Parameters: Authorization Bearer token
See the API docs.
  1. Create Records Endpoint:
    • Method: POST
    • Path: /${baseId}/${tableId}
    • Path Parameters: Add the values for the baseId and for the tableId so they will be available in the path.
    • Header Parameters:
      • Content-Type: application/json
      • Authorization Bearer token
    • Body: JSON format containing the fields for the new record. Example:
3

Design the Workflow

  1. Open the Workflow Designer and create a new workflow.
    • Provide a name and description.
  2. Configure Workflow Nodes:
    • Start Node: Initialize the workflow.
On the start node add the data that you want to extract from the process. This way when you will add the Start Workflow Integration node action it will be populated with this data.
Make sure these keys are also mapped in the data model of your process with their corresponding attributes.
  • REST Node: Set up API calls:
    • GET Endpoint for fetching records from Airtable.
    • POST Endpoint for creating new records.
  • Condition Node: Add logic to handle credit scores (e.g., triggering a warning if the credit score is below 300).
Condition example:
  • Script Node: Include custom scripts if needed for processing data (not used in this example).
  • End Node: Define the end of the workflow with success or failure outcomes.
4

Link the Workflow to a Process

  1. Integrate the workflow into a BPMN process:
    • Open the process diagram and include a User Task and a Receive Message Task.
In this example, we’ll use a User Task because we need to capture user data and send it to our workflow.
  1. Map Data in the UI Designer:
    • Create the data model
    • Link data attributes from the data model to form fields, ensuring the user input aligns with the expected parameters.
  1. Add a Start Integration Workflow node action:
  • Make sure all the input will be captured.
5

Monitor Workflow and Capture Output

Receive Workflow Output:
  • Use the Receive Message Task to capture workflow outputs like status or returned data.
  • Set up a data stream in the node’s Integration Output section to ensure workflow output is mapped to a predefined key.
One key per hop. Data crosses three boundaries on its way back to the process, and each one uses its own name:
  1. Inside the workflow, the REST node stores its result under its Response Key - the body is at ${responseKey.data}.
  2. The End node maps that value into the workflow’s declared output parameter.
  3. The Receive Message Task maps the returned output into a process attribute through its data stream output mapping.
Most “empty value” problems come from using a key from the wrong hop, or from a typo - a wrong key in a ${...} placeholder resolves silently to nothing rather than raising an error. If the result never reaches the process, check the error glossary for the two runtime errors that pinpoint which hop is broken.
6

Start the integration

  • Start your process to initiate the workflow integration. It should add a new user with the details captured in the user task.
  • Check if it worked by going to your base in Airtable. You can see, our user has been added.

This example demonstrates how to integrate Airtable with FlowX to automate data management. You configured a data source, set up endpoints, designed a workflow, and linked it to a BPMN process.

Export and import

You can export and import both data sources and workflows as ZIP files to transfer them between projects or environments (for example, from development to UAT to production).

Exporting

To export a data source or workflow:
  1. Navigate to the Data Sources or Workflows list in Integration Designer
  2. Open the context menu for the resource you want to export
  3. Select Export
  4. The resource is downloaded as a ZIP file containing the full configuration
What’s included in the export:
  • Data Sources - data source configuration, endpoints, NoSQL operations, MCP tools
  • Workflows - workflow nodes and their configurations

Importing

To import a data source or workflow:
  1. Navigate to the Data Sources or Workflows list in Integration Designer
  2. Open the context menu and select Import from ZIP
  3. Select the ZIP file exported from another project or environment
  4. If resources with the same identifiers already exist, a Review Resource Identifiers Conflicts modal appears
  5. Choose a strategy for each conflicting resource (or use Apply to all):
    • Keep both - imports the resource as a new copy alongside the existing one
    • Replace - overwrites the existing resource with the imported version
    • Skip this one - keeps the existing resource unchanged
  6. Click Continue to complete the import
Importing is only available for work-in-progress (WIP) project versions. You cannot import into a committed version.

FAQs

A: For external API calls, the Integration Designer uses REST (HTTP) as the communication protocol. There is no dedicated GraphQL, SOAP, gRPC, or JDBC data source type — but protocols that run over HTTP can be called through a REST data source.You can call a GraphQL endpoint by using a REST data source configured with the POST method, sending the GraphQL query as a JSON body:
Set the endpoint content type to application/json and map the response as you would for any REST call.For SOAP, there is a dedicated SOAP System data source with WSDL import and automatic envelope composition; see SOAP System. You can also call a SOAP web service through REST: configure a POST REST endpoint, set the Content type to Raw, put the SOAP envelope in the request body, and add the Content-Type (text/xml or application/soap+xml) and SOAPAction request headers. The XML response is parsed automatically, so you can map its fields like any JSON response — see Receiving XML and SOAP responses. With the REST approach there is no WSDL import or automatic envelope/fault generation; you build the envelope yourself.gRPC and JDBC are not supported — they are not HTTP-based and have no data source type.The Integration Designer also supports specialized data source types beyond REST: FlowX Database, Unmanaged MongoDB, MCP Server, Knowledge Base, Email Trigger, Email Sender, Incoming Webhook, and Microsoft Outlook. See Data sources for details.
A: The Integration Service handles all security aspects, including certificates and secret keys. Authorization methods like Service Token, Bearer Token, and OAuth 2.0 are supported.
A: Errors are logged within the workflow and can be reviewed in the monitoring dedicated console for troubleshooting and diagnostics
A: You can import full data sources (including their endpoints) and workflows via ZIP files using the Import from ZIP option in the context menu. See the Export and import section for details.Importing endpoint specifications from external formats like Swagger/OpenAPI is not yet supported. Endpoints must be defined manually within the data source configuration.
A: No. You can cache GET and POST endpoints. For POST endpoints, the request body is part of the cache key (see Extended response caching). PUT, PATCH, and DELETE methods cannot be cached, as they are designed to modify data rather than retrieve it.
A: FlowX.AI automatically falls back to calling the external API directly. Your workflows always receive correct data even if caching fails. The failure is logged for monitoring purposes.
A: No, the cache policy is configured at the endpoint level in the Data Source definition. All workflows using that endpoint share the same cache. If you need different caching behavior, create separate endpoint definitions.
A: Cache status is visible in both the endpoint testing modal and the workflow console logs. You’ll see whether the response came from cache (hit) or from the external API (miss), along with the cache key and TTL information.

Academy courses

Integration Designer course

Hands-on course covering systems, data sources, workflows, and REST integration patterns

Data Mappers course

Learn Kafka data mapping and transformation between process and integration workflows
Academy playground projects — if you’re enrolled in the FlowX Academy, explore working examples:
Last modified on October 30, 2026