Node Reference
All node types — AI, script, HTTP, Gmail, form, conditional, loop, wait, subprocess — config shapes and execution.
Complete configuration reference for every node type. Each section includes the config schema, behavior description, input/output shapes, and an example.
Input Nodes
Input nodes are triggers that start process executions.
Gmail Input
Polls a Gmail inbox for new emails matching filters.
Type: inputNode with input type gmail
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name for the node |
authMethod | string | Yes | -- | "oauth" or "service_account" |
gmailToken | string | Conditional | -- | OAuth credentials JSON (if authMethod is oauth) |
serviceAccountId | string | Conditional | -- | Service account UUID (if authMethod is service_account) |
impersonationEmail | string | Conditional | -- | Email to impersonate (service account only) |
senderFilter | string | No | "" | Comma-separated sender emails. Supports wildcards: *@domain.com |
subjectFilter | string | No | "" | Comma-separated keywords to match in subject (case-insensitive substring) |
pollingInterval | int | No | 30 | Seconds between inbox checks |
attachmentMaxSize | int64 | No | 10485760 | Max attachment size in bytes (10 MB default) |
includeThread | bool | No | false | Include full conversation thread |
convertToPlainText | bool | No | false | Convert HTML body to plain text |
separateAttachments | bool | No | false | Separate attachment metadata from email data |
Output Data
{
"id": "msg_abc123",
"thread_id": "thread_xyz789",
"sender": "buyer@example.com",
"recipients": ["orders@yourcompany.com"],
"cc": [],
"subject": "Steel Order Request",
"body": "Plain text email body...",
"body_html": "<p>HTML email body...</p>",
"date": 1712937600,
"receiving_account": "orders@yourcompany.com"
}If includeThread: true, adds:
{
"thread": [
{
"subject": "Re: Steel Order Request",
"sender": "orders@yourcompany.com",
"recipients": ["buyer@example.com"],
"body": "Previous reply...",
"date": 1712851200
}
]
}Output Files
Attachments are uploaded and available as files:
[
{
"name": "spec-sheet.pdf",
"url": "https://storage.example.com/attachments/msg_abc123-0-spec-sheet.pdf",
"size": 245760
}
]Polling Behavior
- Polls every
pollingIntervalseconds - Uses exponential backoff when no emails found (up to 5 minutes)
- Resets to
pollingIntervalwhen emails arrive - Query filter:
in:inbox after:{last_poll_timestamp}
Outlook Input
Polls an Outlook inbox for new emails. Configuration mirrors Gmail Input with Outlook-specific auth.
Type: inputNode with input type outlook
Config and output are structurally identical to Gmail Input, using Outlook OAuth credentials instead.
API Input (Webhook)
Exposes an HTTP endpoint that triggers the process when called.
Type: inputNode with input type api
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
schemaId | string | No | -- | Schema UUID for payload validation |
dataBlockId | string | No | -- | Data block to validate against |
contentType | string | No | "json" | "json", "form-data", "text" |
Webhook URL
When the process is started, the webhook becomes available at:
POST /api/v1/processes/{processId}/webhookAuthentication: API key in the X-API-Key header or Authorization: Bearer {key}.
Input Data
The POST body becomes the node's output data. For JSON:
{
"customer": "John Smith",
"order_details": { ... }
}For multipart form data, files are uploaded and available as file references.
Synchronous Response (Return to Client)
If the process has an output node of type Return to Client, the webhook blocks until execution completes and returns the output node's data as the HTTP response. This enables request-response workflows.
Scheduled Input
Triggers on a cron schedule.
Type: inputNode with input type scheduled
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
cronExpression | string | Yes | -- | Standard cron expression (5 or 6 fields) |
timezone | string | No | "UTC" | IANA timezone (e.g., "America/New_York") |
body | string | No | "{}" | Default JSON payload for each trigger |
Cron Expression Format
┌───────── minute (0-59) │ ┌───────── hour (0-23) │ │ ┌───────── day of month (1-31) │ │ │ ┌───────── month (1-12) │ │ │ │ ┌───────── day of week (0-6, 0=Sunday) │ │ │ │ │ * * * * *
Examples:
0 9 * * 1-5-- 9 AM every weekday*/15 * * * *-- every 15 minutes0 0 1 * *-- midnight on the first of every month
The UI includes an AI-assisted generator: describe your schedule in plain English and it generates the cron expression.
Output Data
{
"triggered_at": "2026-04-12T09:00:00Z",
"cron_expression": "0 9 * * 1-5"
}Plus whatever is in the body config field.
Output Nodes
Output nodes deliver the final results of a process execution.
Gmail Output
Sends or replies to a Gmail message.
Type: outputNode with output type gmail
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
authMethod | string | Yes | -- | "oauth" or "service_account" |
gmailToken | string | Conditional | -- | OAuth credentials |
serviceAccountId | string | Conditional | -- | Service account UUID |
impersonationEmail | string | Conditional | -- | Send-as email |
recipients | string | No | -- | Comma-separated To addresses |
cc | string | No | -- | Comma-separated CC addresses |
bcc | string | No | -- | Comma-separated BCC addresses |
subject | string | No | -- | Email subject (supports templates) |
body | string | No | -- | Email body (supports templates) |
replyMode | string | No | -- | "reply" or "reply_all" |
emailId | string | No | -- | Specific email ID to reply to |
threadId | string | No | -- | Thread ID for reply (supports templates) |
markImportant | bool | No | false | Mark sent email as important |
bodySourceNodes | string[] | No | -- | Node names to pull body content from |
fileReferences | string[] | No | -- | File references to attach |
duplicateFilenameBehavior | string | No | "auto_suffix" | "auto_suffix", "error", "last_wins" |
Reply Mode
To reply to the original email thread (common pattern):
Thread ID: {{input["Email Input"]["thread_id"]}}
Reply Mode: reply
Subject: Re: {{input["Email Input"]["subject"]}}The node fetches the original email, extracts the sender, and sends the reply to that sender within the same thread.
File Attachments
Reference files from upstream nodes:
input["files"]["Email Input"] -- all files from Email Input input["files"]["Email Input"][0] -- first file only input["files"]["OCR Node"][0] -- first file from OCR Node
Output Data
{
"message_id": "msg_def456",
"thread_id": "thread_xyz789",
"provider": "gmail",
"success": true,
"recipients": ["buyer@example.com"],
"subject": "Re: Steel Order Request"
}Outlook Output
Sends or replies to an Outlook message. Configuration mirrors Gmail Output with Outlook-specific auth.
Return to Client
Returns data synchronously to the webhook caller.
Type: outputNode with output type return_to_client
When a process with this output type is triggered via webhook, the HTTP response blocks until execution completes, then returns this node's input data as the response body.
Config
| Field | Type | Required | Description |
|---|---|---|---|
label | string | Yes | Display name |
All upstream data available to this node is returned as the HTTP response.
Console Output
Logs output data for debugging. No external delivery.
Type: outputNode with output type console
Useful during development. The output data appears in the execution history.
Processing Nodes
Schematization
Extracts structured data from unstructured input using an LLM and a schema definition.
Type: schematizationNode
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
schemaId | string | Yes | -- | Schema UUID |
dataBlockIDs | string[] | Yes | -- | Data block UUIDs to extract |
model | string | Yes | -- | LLM model (e.g., "gpt-4o") |
provider | string | No | "openai" | "openai", "anthropic", "gemini", "mistral" |
systemPrompt | string | No | Default extraction prompt | Custom instructions for the LLM |
temperature | float | No | -- | LLM temperature (0-1) |
max_tokens | int | No | -- | Max output tokens |
runOcrOnAttachments | bool | No | false | Run OCR on PDF/image attachments |
ocrMethod | string | No | -- | The OCR method to use |
runTableExtraction | bool | No | false | Extract tables from documents |
passthroughFiles | bool | No | false | Forward input files to output |
contextFiles | string[] | No | -- | File IDs to include as reference |
enableChunking | bool | No | false | Parallel chunking for large documents |
maxConcurrency | int | No | 10 | Max parallel chunking threads |
preprocessingFunctionId | string | No | -- | Function to preprocess input |
deterministicSchematization | bool | No | false | Use preprocessing output directly (skip LLM) |
Targeted Extraction
For fields that are difficult to extract reliably, configure targeted extraction:
{
"targetedFields": [
{
"dataBlockId": "uuid",
"fieldName": "total_amount",
"description": "Look for the grand total at the bottom of the invoice",
"maxAttempts": 3,
"judgeModel": "gpt-4o",
"hintImages": ["file-uuid"]
}
]
}The engine runs multiple extraction attempts at increasing temperatures and uses a judge model to select the best candidate.
Output Data
One key per selected data block:
{
"Order Request": {
"customer_name": "John Smith",
"weight_lbs": 5000,
"steel_type": "carbon"
},
"Quote": {
"estimated_delivery": "10-14 business days"
},
"_metadata": {
"llm": {
"model": "gpt-4o",
"prompt_tokens": 1234,
"completion_tokens": 567
}
}
}How It Works
- Extracts text from input (plain text or OCR on files)
- Optionally runs preprocessing function
- Separates data blocks into solo (no edges) and coupled (with schema edges) groups
- Solo blocks: extracted independently in parallel via LLM structured completion
- Coupled blocks: root selected, then coupling functions derive related blocks
- Field names remapped to match schema definitions
- Targeted extraction runs for configured difficult fields
ML Model
Sends a prompt to an LLM and returns the response.
Type: mlModelNode
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
model | string | Yes | -- | Model ID (e.g., "gpt-4o", "claude-3-5-sonnet") |
provider | string | No | "openai" | "openai", "anthropic", "gemini", "mistral" |
prompt | string | Yes | -- | System prompt |
temperature | float | No | 0.7 | Temperature (0-1) |
topP | float | No | 1.0 | Top-p sampling |
maxTokens | int | No | -- | Max output tokens |
enableTools | bool | No | false | Enable tool/function calling |
webSearchEnabled | bool | No | false | Enable web search (OpenAI only) |
runOcrOnAttachments | bool | No | false | Run OCR on attachments |
runTableExtraction | bool | No | false | Extract tables |
passthroughFiles | bool | No | false | Forward files |
contextFiles | string[] | No | -- | Extra context files |
enableChunking | bool | No | false | Chunk large inputs |
maxConcurrency | int | No | 3 | Max chunk concurrency |
How It Works
- Input data is converted to text via
ExtractTextFromInputs() - System prompt is sent as the
systemmessage - Extracted input text is sent as the
usermessage - File attachments are included with the user message
- LLM response is parsed -- if valid JSON, fields are accessible individually
Output Data
If the LLM returns valid JSON:
{
"summary": "The order is for 5000 lbs of carbon steel",
"sentiment": "neutral",
"_metadata": { "llm": { "model": "gpt-4o", "duration_ms": 2300 } }
}If the LLM returns plain text:
{
"output": "The order is for 5000 lbs of carbon steel...",
"_metadata": { ... }
}Script
Executes Python code in a sandboxed environment.
Type: scriptNode
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
code | string | Yes | -- | Python source code |
inputType | string | No | "text" | "text" or "schematized" |
outputType | string | No | "text" | "text" or "schematized" |
outputDataBlockId | string | Conditional | -- | Required if outputType is schematized |
outputs | array | No | -- | Multiple output port definitions |
passthroughFiles | bool | No | false | Forward files |
Sandbox
The Python environment is sandboxed with restricted access to system resources. Network and filesystem access are disabled.
- Script timeout: 5 minutes
Accessing Input Data
All upstream data is available as the global input_data dict:
# Access a field from an upstream node weight = input_data["Extract Order"]["Order Request"]["weight_lbs"] # Access all input data all_data = input_data # Access text data text = input_data["text"]
Returning Data
Single output:
return {"price": 2250.00, "delivery": "10 days"}Multiple output ports:
return {
"approved": {"status": "approved", "amount": 2250},
"rejected": None # this port gets no data
}Output Data
{
"output": {
"price": 2250.00,
"delivery": "10 days"
}
}Or for schematized output, the data is keyed by the data block name.
Conditional
Branches execution based on conditions or switch-case matching.
Type: conditionalNode
See Flow Control for detailed documentation.
Loop
Iterates a subgraph over an array of items or a set of files.
Type: loopNode
See Flow Control for detailed documentation.
Wait
Pauses execution for a configurable duration.
Type: waitNode
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
duration | int | Yes | -- | Wait time in seconds |
The execution timeout is paused during wait nodes, so waits do not count against the overall timeout.
Output Data
Passes through all input data unchanged.
Database
Queries a connected SQL database.
Type: databaseNode
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
databaseInstanceId | string | Yes | -- | Database instance UUID |
query | string | Yes | -- | SQL query (supports templates) |
schemaName | string | No | "public" | Database schema |
Output Data
{
"rows": [
{ "id": 1, "name": "Carbon Steel", "price_per_lb": 0.45 },
{ "id": 2, "name": "Stainless Steel", "price_per_lb": 1.20 }
],
"row_count": 2
}SQL
Executes raw SQL queries. Similar to Database node but with more direct control.
Type: sqlNode
OCR
Extracts text from images and PDF files.
Type: ocrNode
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
ocrMethod | string | No | -- | The OCR method to use |
runTableExtraction | bool | No | false | Extract structured tables |
passthroughFiles | bool | No | false | Forward files |
Output Data
{
"text": "Extracted text from the document...",
"pages": [
{ "page": 1, "text": "Page 1 content..." },
{ "page": 2, "text": "Page 2 content..." }
],
"_metadata": {
"ocr": {
"method": "ocr",
"duration_ms": 3400,
"pages_processed": 2
}
}
}Web Automation
Controls a headless browser to interact with web pages.
Type: webAutomationNode
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
actions | array | Yes | -- | Sequence of browser actions |
Actions include: navigate to URL, click element, type text, extract text, screenshot, wait for element, etc.
Integration Nodes
Type: integrationsNode
Integration nodes connect to external services. The integration type is specified in the config.
API Fetch
Makes HTTP requests to any REST API.
Config
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
label | string | Yes | -- | Display name |
url | string | Yes | -- | Target URL (supports templates) |
method | string | Yes | -- | GET, POST, PUT, PATCH, DELETE |
contentType | string | No | "application/json" | Request content type |
headers | object | No | -- | Request headers (supports templates) |
dataTemplate | string | No | -- | Request body JSON (supports templates) |
authType | string | No | "none" | "none", "bearer", "header", "query" |
authHeaderName | string | Conditional | -- | Custom auth header name |
authHeaderPrefix | string | Conditional | -- | Auth header prefix (e.g., "Bearer") |
authQueryParamName | string | Conditional | -- | Query param name for auth |
timeoutSeconds | int | No | 30 | Request timeout |
expectedStatusCodes | int[] | No | [200] | Status codes to treat as success |
includeAttachment | bool | No | false | Include files in request |
Example: POST with Templates
{
"url": "https://api.crm.com/contacts",
"method": "POST",
"contentType": "application/json",
"authType": "bearer",
"dataTemplate": "{\"name\": \"{{input[\"Extract Order\"][\"Order Request\"][\"customer_name\"]}}\" , \"email\": \"{{input[\"Extract Order\"][\"Order Request\"][\"customer_email\"]}}\"}"
}Output Data
{
"status_code": 200,
"body": { ... },
"headers": { ... }
}SendGrid
Sends transactional email via SendGrid API.
Config
| Field | Type | Required | Description |
|---|---|---|---|
to | string | Yes | Recipient email |
from | string | Yes | Sender email |
subject | string | Yes | Subject (supports templates) |
body | string | Yes | Body (supports templates) |
apiKey | string | Yes | SendGrid API key reference |
SFTP
Uploads or downloads files via SFTP.
Config
| Field | Type | Required | Description |
|---|---|---|---|
host | string | Yes | SFTP server hostname |
port | int | No | Default 22 |
username | string | Yes | SFTP username |
password | string | Yes | SFTP password |
operation | string | Yes | "upload" or "download" |
remotePath | string | Yes | Remote file path |
fileReferences | string[] | Conditional | Files to upload |