Sea12Docs
Core Concepts

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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name for the node
authMethodstringYes--"oauth" or "service_account"
gmailTokenstringConditional--OAuth credentials JSON (if authMethod is oauth)
serviceAccountIdstringConditional--Service account UUID (if authMethod is service_account)
impersonationEmailstringConditional--Email to impersonate (service account only)
senderFilterstringNo""Comma-separated sender emails. Supports wildcards: *@domain.com
subjectFilterstringNo""Comma-separated keywords to match in subject (case-insensitive substring)
pollingIntervalintNo30Seconds between inbox checks
attachmentMaxSizeint64No10485760Max attachment size in bytes (10 MB default)
includeThreadboolNofalseInclude full conversation thread
convertToPlainTextboolNofalseConvert HTML body to plain text
separateAttachmentsboolNofalseSeparate attachment metadata from email data

Output Data

json
{
  "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:

json
{
  "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:

json
[
  {
    "name": "spec-sheet.pdf",
    "url": "https://storage.example.com/attachments/msg_abc123-0-spec-sheet.pdf",
    "size": 245760
  }
]

Polling Behavior

  • Polls every pollingInterval seconds
  • Uses exponential backoff when no emails found (up to 5 minutes)
  • Resets to pollingInterval when 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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
schemaIdstringNo--Schema UUID for payload validation
dataBlockIdstringNo--Data block to validate against
contentTypestringNo"json""json", "form-data", "text"

Webhook URL

When the process is started, the webhook becomes available at:

POST /api/v1/processes/{processId}/webhook

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

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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
cronExpressionstringYes--Standard cron expression (5 or 6 fields)
timezonestringNo"UTC"IANA timezone (e.g., "America/New_York")
bodystringNo"{}"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 minutes
  • 0 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

json
{
  "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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
authMethodstringYes--"oauth" or "service_account"
gmailTokenstringConditional--OAuth credentials
serviceAccountIdstringConditional--Service account UUID
impersonationEmailstringConditional--Send-as email
recipientsstringNo--Comma-separated To addresses
ccstringNo--Comma-separated CC addresses
bccstringNo--Comma-separated BCC addresses
subjectstringNo--Email subject (supports templates)
bodystringNo--Email body (supports templates)
replyModestringNo--"reply" or "reply_all"
emailIdstringNo--Specific email ID to reply to
threadIdstringNo--Thread ID for reply (supports templates)
markImportantboolNofalseMark sent email as important
bodySourceNodesstring[]No--Node names to pull body content from
fileReferencesstring[]No--File references to attach
duplicateFilenameBehaviorstringNo"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

json
{
  "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

FieldTypeRequiredDescription
labelstringYesDisplay 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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
schemaIdstringYes--Schema UUID
dataBlockIDsstring[]Yes--Data block UUIDs to extract
modelstringYes--LLM model (e.g., "gpt-4o")
providerstringNo"openai""openai", "anthropic", "gemini", "mistral"
systemPromptstringNoDefault extraction promptCustom instructions for the LLM
temperaturefloatNo--LLM temperature (0-1)
max_tokensintNo--Max output tokens
runOcrOnAttachmentsboolNofalseRun OCR on PDF/image attachments
ocrMethodstringNo--The OCR method to use
runTableExtractionboolNofalseExtract tables from documents
passthroughFilesboolNofalseForward input files to output
contextFilesstring[]No--File IDs to include as reference
enableChunkingboolNofalseParallel chunking for large documents
maxConcurrencyintNo10Max parallel chunking threads
preprocessingFunctionIdstringNo--Function to preprocess input
deterministicSchematizationboolNofalseUse preprocessing output directly (skip LLM)

Targeted Extraction

For fields that are difficult to extract reliably, configure targeted extraction:

json
{
  "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:

json
{
  "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

  1. Extracts text from input (plain text or OCR on files)
  2. Optionally runs preprocessing function
  3. Separates data blocks into solo (no edges) and coupled (with schema edges) groups
  4. Solo blocks: extracted independently in parallel via LLM structured completion
  5. Coupled blocks: root selected, then coupling functions derive related blocks
  6. Field names remapped to match schema definitions
  7. Targeted extraction runs for configured difficult fields

ML Model

Sends a prompt to an LLM and returns the response.

Type: mlModelNode

Config

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
modelstringYes--Model ID (e.g., "gpt-4o", "claude-3-5-sonnet")
providerstringNo"openai""openai", "anthropic", "gemini", "mistral"
promptstringYes--System prompt
temperaturefloatNo0.7Temperature (0-1)
topPfloatNo1.0Top-p sampling
maxTokensintNo--Max output tokens
enableToolsboolNofalseEnable tool/function calling
webSearchEnabledboolNofalseEnable web search (OpenAI only)
runOcrOnAttachmentsboolNofalseRun OCR on attachments
runTableExtractionboolNofalseExtract tables
passthroughFilesboolNofalseForward files
contextFilesstring[]No--Extra context files
enableChunkingboolNofalseChunk large inputs
maxConcurrencyintNo3Max chunk concurrency

How It Works

  1. Input data is converted to text via ExtractTextFromInputs()
  2. System prompt is sent as the system message
  3. Extracted input text is sent as the user message
  4. File attachments are included with the user message
  5. LLM response is parsed -- if valid JSON, fields are accessible individually

Output Data

If the LLM returns valid JSON:

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:

json
{
  "output": "The order is for 5000 lbs of carbon steel...",
  "_metadata": { ... }
}

Script

Executes Python code in a sandboxed environment.

Type: scriptNode

Config

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
codestringYes--Python source code
inputTypestringNo"text""text" or "schematized"
outputTypestringNo"text""text" or "schematized"
outputDataBlockIdstringConditional--Required if outputType is schematized
outputsarrayNo--Multiple output port definitions
passthroughFilesboolNofalseForward 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:

python
# 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:

python
return {"price": 2250.00, "delivery": "10 days"}

Multiple output ports:

python
return {
    "approved": {"status": "approved", "amount": 2250},
    "rejected": None  # this port gets no data
}

Output Data

json
{
  "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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
durationintYes--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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
databaseInstanceIdstringYes--Database instance UUID
querystringYes--SQL query (supports templates)
schemaNamestringNo"public"Database schema

Output Data

json
{
  "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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
ocrMethodstringNo--The OCR method to use
runTableExtractionboolNofalseExtract structured tables
passthroughFilesboolNofalseForward files

Output Data

json
{
  "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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
actionsarrayYes--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

FieldTypeRequiredDefaultDescription
labelstringYes--Display name
urlstringYes--Target URL (supports templates)
methodstringYes--GET, POST, PUT, PATCH, DELETE
contentTypestringNo"application/json"Request content type
headersobjectNo--Request headers (supports templates)
dataTemplatestringNo--Request body JSON (supports templates)
authTypestringNo"none""none", "bearer", "header", "query"
authHeaderNamestringConditional--Custom auth header name
authHeaderPrefixstringConditional--Auth header prefix (e.g., "Bearer")
authQueryParamNamestringConditional--Query param name for auth
timeoutSecondsintNo30Request timeout
expectedStatusCodesint[]No[200]Status codes to treat as success
includeAttachmentboolNofalseInclude files in request

Example: POST with Templates

json
{
  "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

json
{
  "status_code": 200,
  "body": { ... },
  "headers": { ... }
}

SendGrid

Sends transactional email via SendGrid API.

Config

FieldTypeRequiredDescription
tostringYesRecipient email
fromstringYesSender email
subjectstringYesSubject (supports templates)
bodystringYesBody (supports templates)
apiKeystringYesSendGrid API key reference

SFTP

Uploads or downloads files via SFTP.

Config

FieldTypeRequiredDescription
hoststringYesSFTP server hostname
portintNoDefault 22
usernamestringYesSFTP username
passwordstringYesSFTP password
operationstringYes"upload" or "download"
remotePathstringYesRemote file path
fileReferencesstring[]ConditionalFiles to upload