Action Nodes
Nodes that perform actions like sending messages, making calls, and responding to requests.
Available Nodes
Respond
Send a response back to the trigger (webhook or interface event).
Configuration:
| Field | Type | Description |
|---|---|---|
statusCode | number | HTTP status code (default: 200) |
contentType | select | application/json, text/plain, or text/html |
headers | keyvalue | Response headers |
body | expression | Response body |
Example - JSON Response:
{
"id": "respond-1",
"type": "respond",
"label": "Return Data",
"config": {
"statusCode": 200,
"contentType": "application/json",
"body": "{{ { success: true, data: $node.fetch_data-1.data } }}"
}
}Example - Return Previous Node Output:
{
"config": {
"statusCode": 200,
"body": "{{ $input }}"
}
}Example - Custom Success Message:
{
"config": {
"statusCode": 200,
"body": "{{ { success: true, id: $node.table_insert-1.record.id } }}"
}
}Send Email
Send an email via your configured email provider (Resend or Gmail).
Configuration:
| Field | Type | Description |
|---|---|---|
emailConfig | object | Email configuration object |
Email Config Fields:
to- Recipient email(s)from- Sender email (must be verified domain for Resend)subject- Email subjectbody- Email body (HTML or plain text)bodyType-htmlortextreplyTo- Reply-to address (optional)
Example:
{
"id": "send_email-1",
"type": "send_email",
"label": "Send Welcome Email",
"config": {
"emailConfig": {
"to": "{{ $input.email }}",
"from": "notifications@yourcompany.com",
"subject": "Welcome to {{ $input.companyName }}!",
"bodyType": "html",
"body": "<h1>Welcome, {{ $input.name }}!</h1><p>Thanks for signing up.</p>"
}
}
}Output:
{{ $node.send_email-1.success }}- Boolean success status{{ $node.send_email-1.messageId }}- Email message ID
Required: Configure email integration in Settings → Integrations.
Send SMS
Send an SMS via Twilio.
Configuration:
| Field | Type | Description |
|---|---|---|
from | string | Twilio phone number (select from your account) |
to | expression | Recipient phone number (E.164 format) |
message | text | Message content (max 1600 characters) |
Example:
{
"id": "send_sms-1",
"type": "send_sms",
"label": "Send Verification Code",
"config": {
"from": "+15551234567",
"to": "{{ $input.phone }}",
"message": "Your verification code is: {{ $input.code }}. Valid for 10 minutes."
}
}Output:
{{ $node.send_sms-1.success }}- Boolean success status{{ $node.send_sms-1.sid }}- Twilio message SID
Required: Configure Twilio credentials in Settings → Credentials.
Voice Agent
Make an outbound AI voice call using ElevenLabs.
Configuration:
| Field | Type | Description |
|---|---|---|
agentId | string | ElevenLabs agent ID |
phoneNumberId | string | ElevenLabs phone number resource ID |
to | expression | Phone number to call |
dynamicVariables | json | Context data for the call |
Example:
{
"id": "voice_agent-1",
"type": "voice_agent",
"label": "Appointment Reminder",
"config": {
"agentId": "agent_abc123",
"phoneNumberId": "pn_xyz789",
"to": "{{ $input.phone }}",
"dynamicVariables": {
"customer_name": "{{ $input.name }}",
"appointment_time": "{{ $input.appointmentTime }}"
}
}
}Output (after call completes):
{{ $node.voice_agent-1.call_result.conversation_id }}- Conversation ID{{ $node.voice_agent-1.transcript }}- Full call transcript{{ $node.voice_agent-1.data_collection }}- Collected data{{ $node.voice_agent-1.call_duration_secs }}- Call duration{{ $node.voice_agent-1.status }}- Call status
Getting Agent and Phone IDs:
# List voice agents
node bin/lux-cli/lux.js voice-agents list
# List phone numbers
node bin/lux-cli/lux.js voice-agents phonesSee Voice Agents for agent configuration.
Logic Nodes
If
Branch workflow based on conditions.
Configuration:
| Field | Type | Description |
|---|---|---|
conditions | object | Condition rules |
Conditions Format:
{
"conditions": {
"combineWith": "and",
"rules": [
{ "value": "{{ $input.status }}", "dataType": "string", "operator": "equals", "compareTo": "active" }
]
}
}Available Operators:
- String:
equals,not_equals,contains,starts_with,ends_with - Number:
equals,not_equals,gt,gte,lt,lte - Boolean:
is_true,is_false
Output Ports:
true- Condition passesfalse- Condition fails
Example:
{
"id": "if-1",
"type": "if",
"label": "Check VIP Status",
"config": {
"conditions": {
"combineWith": "and",
"rules": [
{ "value": "{{ $input.totalOrders }}", "dataType": "number", "operator": "gte", "compareTo": "100" }
]
}
}
}Wait
Pause workflow execution.
Configuration:
| Field | Type | Description |
|---|---|---|
waitType | select | duration or until |
durationValue | number | Wait value (for duration) |
durationUnit | select | seconds, minutes, hours, days |
untilTime | expression | ISO timestamp to wait until |
Example - Wait 5 Minutes:
{
"config": {
"waitType": "duration",
"durationValue": 5,
"durationUnit": "minutes"
}
}Throw Error
Explicitly fail the workflow with a custom error.
Configuration:
| Field | Type | Description |
|---|---|---|
message | expression | Error message |
errorCode | string | Error code (optional) |
Example:
{
"id": "throw_error-1",
"type": "throw_error",
"label": "Validation Failed",
"config": {
"message": "Invalid input: {{ $input.field }} is required",
"errorCode": "VALIDATION_ERROR"
}
}Best Practices
Return Meaningful Responses
{
"body": "{{ { success: true, id: $node.table_insert-1.record.id, message: 'Created successfully' } }}"
}Handle Errors
Use If nodes to check for failures before responding:
Action → If (success) → Respond Success
↘ Respond ErrorRate Limiting
Use Wait nodes between bulk operations:
Loop → Send Email → Wait 1 second → NextSee Also: