Otogent Nodes Reference

Summary

Otogent Nodes are the individual processing units within a Workflow DAG. Each Node has a type (one of 33 NodeType enum values), a configuration schema, input/output ports, optional credential bindings, and an execute function. This document provides the complete reference for every Node type, organized by category: Trigger, Action, Logic, and Transformation.

Purpose

This reference enables AI agents and developers to select the correct Node type for a given task, understand its configuration requirements, and predict its behavior within a Workflow Execution.

Concepts

See 00-glossary.md. Key terms: Node, Node Type, Port, Credential, Node Execution, Node Definition, Workflow Context.

Node Definition System

Every Node type is defined by a NodeDefinition interface:

interface NodeDefinition {
  type: NodeType;             // Enum value (e.g., "OPENAI", "HTTP_REQUEST")
  version: number;            // Schema version (default: 1)
  label: string;              // Display name in editor
  category: "trigger" | "action" | "logic" | "transformation";
  description?: string;       // Purpose description

  fields: NodeFieldDefinition[];      // UI configuration fields
  configSchema: ZodObject;            // Zod validation schema
  ports: PortDefinition[];            // Input/output connection points
  credentials: CredentialRequirement[]; // Required credential bindings

  execute?(ctx: NodeExecutionContext): Promise<NodeExecutionResult>;
  getSummary?(data: Config): string;
  migrate?(oldData: unknown, fromVersion: number): unknown;
}

Port System

Each Node has named input and output Ports:

interface PortDefinition {
  id: string;        // Handle name (e.g., "main", "true", "false", "error")
  label: string;     // Display label
  direction: "in" | "out";
  isDefault?: boolean;
}

Default port: { id: "main", direction: "out", isDefault: true }

Credential System

Nodes declare credential requirements:

interface CredentialRequirement {
  key: string;            // Access key in ctx.credentials[key]
  type: CredentialType;   // OPENAI | ANTHROPIC | GEMINI | GEMMA | HUGGINGFACE | COMPOSIO | GENERIC
  required: boolean;
}

At execution time, the engine:

  1. Reads the credential ID from node.data[key]
  2. Loads the Credential record from the database (scoped to Organization)
  3. Decrypts valueEncrypted using the ENCRYPTION_KEY
  4. Injects plaintext into ctx.credentials[key]

Execution Contract

Every Node executor returns:

interface NodeExecutionResult {
  status: "SUCCESS" | "FAILURE" | "RETRY";
  data: unknown;          // Output data merged into Workflow Context
  routeId: string;        // Output port handle (e.g., "main", "true", "error")
  error?: {
    message: string;
    code: string;
    stack?: string;
    isRetriable: boolean;
  };
}

Field Types

Configuration fields for the visual editor:

Field TypeDescriptionExample Use
textSingle-line text inputURL, API key name
textareaMulti-line text inputPrompt, message body
numberNumeric inputDelay milliseconds, max tokens
selectDropdown selectionModel name, HTTP method
switchBoolean toggleEnable/disable feature
jsonJSON editorRequest body, headers
codeCode editorSQL query, template
credentialCredential pickerSelect from Organization credentials

Trigger Nodes

Trigger Nodes initiate Workflow Execution. A Workflow may have one or more Trigger Nodes. When multiple Trigger Nodes exist, the engine uses resolveWorkflowStartNodeIds to determine which one activated the current Execution.

INITIAL

PropertyValue
TypeINITIAL
Categorytrigger
PurposeDefault start node created with every new Workflow
InputsNone
OutputsPort "main"
CredentialsNone
BehaviorPasses through to downstream Nodes. Acts as an anchor for the DAG root

MANUAL_TRIGGER

PropertyValue
TypeMANUAL_TRIGGER
Categorytrigger
PurposeUser-initiated execution via the "Run" button in the UI
InputsOptional initial data from the trigger form
OutputsPort "main"
CredentialsNone
Real-timeInngest channel: manualTriggerChannel
BehaviorSends Inngest event with triggerNodeId pointing to this Node

WEBHOOK_TRIGGER

PropertyValue
TypeWEBHOOK_TRIGGER
Categorytrigger
PurposeStart execution when an external HTTP POST is received
InputsHTTP request body as initial data
OutputsPort "main"
CredentialsNone (uses Workflow webhookSecretHash)
Authenticationx-otogent-webhook-secret header, SHA-256 hash comparison
Real-timeInngest channel: webhookTriggerChannel
SecurityConstant-time comparison via crypto.timingSafeEqual

GOOGLE_FORM_TRIGGER

PropertyValue
TypeGOOGLE_FORM_TRIGGER
Categorytrigger
PurposeStart execution when a Google Form submission is received
InputsForm response data
OutputsPort "main"
CredentialsNone (OAuth handled at integration level)
Real-timeInngest channel: googleFormTriggerChannel

STRIPE_TRIGGER

PropertyValue
TypeSTRIPE_TRIGGER
Categorytrigger
PurposeStart execution on Stripe payment/subscription events
InputsStripe event payload
OutputsPort "main"
CredentialsNone (webhook signature validation)
Real-timeInngest channel: stripeTriggerChannel

SCHEDULE

PropertyValue
TypeSCHEDULE
Categorytrigger
PurposeStart execution on a time-based schedule (cron or interval)
InputsConfigured schedule expression
OutputsPort "main"
CredentialsNone
Real-timeInngest channel: scheduleChannel
ConfigurationCron expression or interval duration

Action Nodes — AI Models

OPENAI

PropertyValue
TypeOPENAI
Categoryaction
PurposeCall OpenAI models (GPT-4o, GPT-4, GPT-3.5-turbo)
InputsWorkflow Context (prompt from config or context data)
OutputsPort "main" — model response merged into context
CredentialsOPENAI (API key)
Real-timeInngest channel: openAiChannel
Configurationmodel, prompt/systemPrompt, temperature, maxTokens
RegisteredYes — in NodeDefinition registry (openAiDefinition)
Error codesOPENAI_API_ERROR, RATE_LIMIT, INVALID_API_KEY

ANTHROPIC

PropertyValue
TypeANTHROPIC
Categoryaction
PurposeCall Anthropic Claude models (Claude 3.5 Sonnet, Opus, Haiku)
InputsWorkflow Context
OutputsPort "main"
CredentialsANTHROPIC (API key)
Real-timeInngest channel: anthropicChannel
Configurationmodel, prompt, systemPrompt, maxTokens, temperature

GEMINI

PropertyValue
TypeGEMINI
Categoryaction
PurposeCall Google Gemini models (1.5 Pro, Flash)
InputsWorkflow Context
OutputsPort "main"
CredentialsGEMINI (API key)
Real-timeInngest channel: geminiChannel
Configurationmodel, prompt, temperature, maxTokens

GEMMA

PropertyValue
TypeGEMMA
Categoryaction
PurposeCall hosted Gemma models via Google Generative AI provider
InputsWorkflow Context
OutputsPort "main"
CredentialsGEMMA (API key + model ID)
Real-timeInngest channel: gemmaChannel
ConfigurationmodelId (exact hosted Gemma model ID), prompt

HUGGINGFACE

PropertyValue
TypeHUGGINGFACE
Categoryaction
PurposeCall open-source models via Hugging Face Inference API
InputsWorkflow Context
OutputsPort "main"
CredentialsHUGGINGFACE (API token)
Real-timeInngest channel: huggingFaceChannel
ConfigurationmodelId (preset or custom model ID), prompt

Action Nodes — Messaging

DISCORD

PropertyValue
TypeDISCORD
Categoryaction
PurposeSend messages to Discord channels via bot/webhook
InputsWorkflow Context (message content from config)
OutputsPort "main"
CredentialsGENERIC (Discord bot token or webhook URL)
Real-timeInngest channel: discordChannel

SLACK

PropertyValue
TypeSLACK
Categoryaction
PurposeSend messages to Slack channels
InputsWorkflow Context
OutputsPort "main"
CredentialsGENERIC (Slack bot token)
Real-timeInngest channel: slackChannel

TELEGRAM

PropertyValue
TypeTELEGRAM
Categoryaction
PurposeSend messages via Telegram Bot API
InputsWorkflow Context
OutputsPort "main"
CredentialsGENERIC (Telegram bot token)
Real-timeInngest channel: telegramChannel

EMAIL_SEND

PropertyValue
TypeEMAIL_SEND
Categoryaction
PurposeSend transactional email via Resend
InputsWorkflow Context (to, subject, body from config)
OutputsPort "main"
CredentialsNone (uses platform RESEND_API_KEY)
Real-timeInngest channel: emailChannel

EMAIL_PARSER

PropertyValue
TypeEMAIL_PARSER
Categoryaction
PurposeParse incoming email content and extract structured data
InputsRaw email data from Workflow Context
OutputsPort "main" — parsed email fields
CredentialsNone
Real-timeInngest channel: emailParserChannel

TWILIO_SMS

PropertyValue
TypeTWILIO_SMS
Categoryaction
PurposeSend SMS messages via Twilio
InputsWorkflow Context (to, body from config)
OutputsPort "main"
CredentialsGENERIC (Twilio Account SID + Auth Token)
Real-timeInngest channel: twilioSmsChannel

Action Nodes — Social Media

X

PropertyValue
TypeX
Categoryaction
PurposePost to X (Twitter)
InputsWorkflow Context
OutputsPort "main"
CredentialsGENERIC (X API credentials)
Real-timeInngest channel: xChannel

LINKEDIN

PropertyValue
TypeLINKEDIN
Categoryaction
PurposePost to LinkedIn
InputsWorkflow Context
OutputsPort "main"
CredentialsGENERIC (LinkedIn API credentials)
Real-timeInngest channel: linkedinChannel

INSTAGRAM

PropertyValue
TypeINSTAGRAM
Categoryaction
PurposePost to Instagram
InputsWorkflow Context
OutputsPort "main"
CredentialsGENERIC (Instagram API credentials)
Real-timeInngest channel: instagramChannel

Action Nodes — Data & Services

HTTP_REQUEST

PropertyValue
TypeHTTP_REQUEST
Categoryaction
PurposeMake arbitrary HTTP requests to any URL
InputsWorkflow Context (url, method, headers, body from config)
OutputsPort "main" — HTTP response data
CredentialsOptional GENERIC
Real-timeInngest channel: httpRequestChannel
RegisteredYes — in NodeDefinition registry (httpRequestDefinition)
Configurationurl, method (GET/POST/PUT/DELETE/PATCH), headers, body, auth

GOOGLE_SHEETS

PropertyValue
TypeGOOGLE_SHEETS
Categoryaction
PurposeRead from or write to Google Sheets
InputsWorkflow Context
OutputsPort "main" — sheet data
CredentialsGENERIC (Google service account or OAuth token)
Real-timeInngest channel: googleSheetsChannel

DB_QUERY

PropertyValue
TypeDB_QUERY
Categoryaction
PurposeExecute database queries
InputsWorkflow Context (query, connection string from config)
OutputsPort "main" — query results
CredentialsGENERIC (database connection credentials)
Real-timeInngest channel: dbQueryChannel

FILE_STORAGE

PropertyValue
TypeFILE_STORAGE
Categoryaction
PurposeRead or write files to cloud storage
InputsWorkflow Context
OutputsPort "main" — file metadata or content
CredentialsGENERIC (storage credentials)
Real-timeInngest channel: fileStorageChannel

HUBSPOT

PropertyValue
TypeHUBSPOT
Categoryaction
PurposeCRM operations via HubSpot API (create/update contacts, deals)
InputsWorkflow Context
OutputsPort "main" — HubSpot response
CredentialsGENERIC (HubSpot API key or OAuth token)
Real-timeInngest channel: hubspotChannel

SHOPIFY

PropertyValue
TypeSHOPIFY
Categoryaction
PurposeE-commerce operations via Shopify API
InputsWorkflow Context
OutputsPort "main" — Shopify response
CredentialsGENERIC (Shopify API credentials)
Real-timeInngest channel: shopifyChannel

COMPOSIO

PropertyValue
TypeCOMPOSIO
Categoryaction
PurposeExecute any of 250+ Composio tool actions
InputsWorkflow Context + Composio action ID
OutputsPort "main" — tool action response
CredentialsCOMPOSIO (Composio API key)
RegisteredYes — in NodeDefinition registry (composioDefinition)
ConfigurationtoolkitSlug, actionId, parameters
NoteComposio Integration must be connected at the Organization level

Logic Nodes

ROUTER

PropertyValue
TypeROUTER
Categorylogic
PurposeSelect a named branch from Workflow Context state
InputsPort "main"
OutputsNamed output ports (configurable branch names)
CredentialsNone
BehaviorReads a state variable and returns a routeId matching an output port
Route selectionEngine stores routeId in context.__routes[nodeId], Connection fromOutput must match

CONDITION

PropertyValue
TypeCONDITION
Categorylogic
PurposeEvaluate a conditional expression and route accordingly
InputsPort "main"
OutputsNamed output ports (e.g., "true", "false")
CredentialsNone
BehaviorEvaluates condition against Workflow Context, returns routeId
ErrorIf routeId is empty for a branching node → MISSING_BRANCH_ROUTE error

HUMAN_APPROVAL

PropertyValue
TypeHUMAN_APPROVAL
Categorylogic
PurposePause Workflow Execution and wait for human approval
InputsPort "main"
OutputsPort "main" (continues after approval)
CredentialsNone
Behavior (Legacy)Sets Execution status to WAITING_APPROVAL, returns control
Behavior (LangGraph)Sets __pendingApproval in state, conditional edge routes to END
ResumptionFrom Execution detail page: approve → resumes with checkpoint state

MERGE

PropertyValue
TypeMERGE
Categorylogic
PurposeJoin multiple parallel branches into a single execution path
InputsMultiple input ports (from parallel branches)
OutputsPort "main"
CredentialsNone
BehaviorWaits for all incoming Connections, then continues

Transformation Nodes

SET_VARIABLE

PropertyValue
TypeSET_VARIABLE
Categorytransformation
PurposeSet or update a key-value pair in Workflow Context
InputsPort "main"
OutputsPort "main"
CredentialsNone
ConfigurationVariable name, value (static or from context)

TEXT_TEMPLATE

PropertyValue
TypeTEXT_TEMPLATE
Categorytransformation
PurposeRender a Handlebars template using Workflow Context data
InputsPort "main"
OutputsPort "main" — rendered text in context
CredentialsNone
ConfigurationHandlebars template string
EngineHandlebars (handlebars npm package)

JSON_TRANSFORM

PropertyValue
TypeJSON_TRANSFORM
Categorytransformation
PurposeTransform JSON data structures (map, filter, reshape)
InputsPort "main"
OutputsPort "main" — transformed JSON
CredentialsNone
ConfigurationTransformation expression or mapping definition

DELAY

PropertyValue
TypeDELAY
Categorytransformation
PurposePause Workflow Execution for a configured duration
InputsPort "main"
OutputsPort "main"
CredentialsNone
ConfigurationdelayMs (milliseconds)
NoteUses Node.delayMs field from the database schema

LOGGER

PropertyValue
TypeLOGGER
Categorytransformation
PurposeLog Workflow Context data to execution logs for debugging
InputsPort "main"
OutputsPort "main"
CredentialsNone
ConfigurationLog level, message template
Side effectsWrites to NodeExecution.logs JSON array

Agent Instructions

When selecting a Node type for a Workflow step, use this reference to match the task to the correct Node type. Each Node type has a specific purpose — do not use generic Nodes when a specialized Node exists.

Node Selection Guide

IF task is "call an LLM"
  → Use OPENAI, ANTHROPIC, GEMINI, GEMMA, or HUGGINGFACE based on provider

IF task is "send a message"
  → Use DISCORD, SLACK, TELEGRAM, EMAIL_SEND, or TWILIO_SMS based on channel

IF task is "make an HTTP API call"
  → Use HTTP_REQUEST for arbitrary APIs, or a specific integration Node if available

IF task is "connect to a SaaS tool"
  → Use COMPOSIO for 250+ tools, or HUBSPOT/SHOPIFY for native integrations

IF task is "route based on a condition"
  → Use CONDITION for expression-based routing, ROUTER for state-based routing

IF task is "wait for human review"
  → Use HUMAN_APPROVAL

IF task is "transform data"
  → Use SET_VARIABLE, TEXT_TEMPLATE, or JSON_TRANSFORM

IF task is "add a delay"
  → Use DELAY

IF task is "log for debugging"
  → Use LOGGER

Decision Tree

IF you need an LLM call:
  IF you want OpenAI → OPENAI Node
  IF you want Claude → ANTHROPIC Node
  IF you want Gemini → GEMINI Node
  IF you want an open-source model → HUGGINGFACE Node
  IF you want Gemma → GEMMA Node

IF you need to send a notification:
  IF via Slack → SLACK Node
  IF via Discord → DISCORD Node
  IF via email → EMAIL_SEND Node
  IF via SMS → TWILIO_SMS Node
  IF via Telegram → TELEGRAM Node

IF you need conditional logic:
  IF evaluating an expression → CONDITION Node
  IF reading a state variable for routing → ROUTER Node
  IF requiring human decision → HUMAN_APPROVAL Node
  IF joining parallel paths → MERGE Node

Common Errors

ErrorNode Types AffectedCauseFix
MISSING_BRANCH_ROUTEROUTER, CONDITIONBranching Node did not return a routeIdEnsure Node config produces a route matching a Connection handle
INVALID_API_KEYOPENAI, ANTHROPIC, GEMINICredential decryption succeeded but key is invalidUpdate the Credential with a valid API key
RATE_LIMITOPENAI, ANTHROPIC, GEMINIProvider rate limit exceededAdd DELAY Node before the model call, or reduce concurrency
Failed to decryptAny Node with credentialsENCRYPTION_KEY mismatchRestore correct ENCRYPTION_KEY or re-create Credential
Executor not foundAny Node typeNode type not registered in executor registryEnsure the Node type is supported in the current version

Related Pages