This workflow corresponds to n8n.io template #theluxapp-v1 — we link there as the canonical source.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "TheLuxApp AI ChatBot \u2014 Master Workflow",
"meta": {
"templateId": "theluxapp-v1"
},
"nodes": [
{
"parameters": {
"httpMethod": "POST",
"path": "luxapp-chat",
"responseMode": "responseNode",
"options": {}
},
"id": "n1-webhook",
"name": "Webhook \u2014 Receive Message",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
240,
300
],
"notes": "Entry point. POST to /webhook/luxapp-chat with body: { platform, userId, message, conversationId? }"
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "platform",
"value": "={{ $json.body.platform ?? 'web' }}",
"type": "string"
},
{
"id": "a2",
"name": "userId",
"value": "={{ $json.body.userId ?? 'anonymous' }}",
"type": "string"
},
{
"id": "a3",
"name": "message",
"value": "={{ $json.body.message ?? '' }}",
"type": "string"
},
{
"id": "a4",
"name": "conversationId",
"value": "={{ $json.body.conversationId ?? '' }}",
"type": "string"
},
{
"id": "a5",
"name": "tenantId",
"value": "={{ $json.body.tenantId ?? $env.LUXAPP_TENANT_ID }}",
"type": "string"
}
]
},
"options": {}
},
"id": "n2-set",
"name": "Normalise Input",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
460,
300
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.message }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "n3-guard",
"name": "Guard \u2014 Message Not Empty",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
680,
300
]
},
{
"parameters": {
"method": "POST",
"url": "={{ $env.LUXAPP_BASE_URL }}/v1/chat/completions",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
},
{
"name": "Authorization",
"value": "=ApiKey {{ $env.LUXAPP_API_KEY }}"
},
{
"name": "X-Tenant-ID",
"value": "={{ $json.tenantId }}"
}
]
},
"sendBody": true,
"bodyParameters": {
"parameters": [
{
"name": "messages",
"value": "=[{\"role\":\"user\",\"content\":\"{{ $json.message }}\"}]"
},
{
"name": "stream",
"value": "=false"
},
{
"name": "tools_enabled",
"value": "=true"
},
{
"name": "knowledge_enabled",
"value": "=true"
},
{
"name": "conversation_id",
"value": "={{ $json.conversationId || undefined }}"
}
]
},
"options": {
"timeout": 60000,
"response": {
"response": {
"responseFormat": "json"
}
}
}
},
"id": "n4-api",
"name": "LuxApp \u2014 Chat Completions API",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
900,
220
],
"notes": "Calls POST /v1/chat/completions. Requires LUXAPP_BASE_URL, LUXAPP_API_KEY, LUXAPP_TENANT_ID env vars."
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "c2",
"leftValue": "={{ $json.content }}",
"rightValue": "",
"operator": {
"type": "string",
"operation": "notEmpty"
}
}
],
"combinator": "and"
}
},
"id": "n5-check",
"name": "Check API Response",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
1120,
220
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "b1",
"name": "reply",
"value": "={{ $json.content }}",
"type": "string"
},
{
"id": "b2",
"name": "conversationId",
"value": "={{ $json.conversation_id }}",
"type": "string"
},
{
"id": "b3",
"name": "model",
"value": "={{ $json.model }}",
"type": "string"
},
{
"id": "b4",
"name": "citations",
"value": "={{ $json.citations }}",
"type": "object"
},
{
"id": "b5",
"name": "tokensUsed",
"value": "={{ $json.usage?.output_tokens ?? 0 }}",
"type": "number"
}
]
}
},
"id": "n6-format",
"name": "Format Success Response",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1340,
140
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "e1",
"name": "reply",
"value": "Sorry, I encountered an error. Please try again.",
"type": "string"
},
{
"id": "e2",
"name": "error",
"value": "={{ $json.error?.message ?? 'Unknown error' }}",
"type": "string"
}
]
}
},
"id": "n7-error-format",
"name": "Format Error Response",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
1340,
340
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "g1",
"name": "reply",
"value": "Please provide a message to continue.",
"type": "string"
}
]
}
},
"id": "n8-guard-resp",
"name": "Empty Message Response",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
900,
420
]
},
{
"parameters": {
"respondWith": "json",
"responseBody": "={{ { reply: $json.reply, conversationId: $json.conversationId, model: $json.model, citations: $json.citations, error: $json.error } }}"
},
"id": "n9-respond",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1560,
300
]
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
},
"id": "n10-schedule",
"name": "Schedule \u2014 Hourly Health Check",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
240,
600
]
},
{
"parameters": {
"method": "GET",
"url": "={{ $env.LUXAPP_BASE_URL }}/health",
"options": {
"timeout": 5000
}
},
"id": "n11-health",
"name": "Health Check",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
460,
600
]
},
{
"parameters": {
"conditions": {
"conditions": [
{
"id": "h1",
"leftValue": "={{ $json.status }}",
"rightValue": "ok",
"operator": {
"type": "string",
"operation": "equals"
}
}
]
}
},
"id": "n12-health-check",
"name": "Health OK?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
680,
600
]
},
{
"parameters": {
"jsCode": "// Log health check pass\nconsole.log('[LuxApp] Health check passed at', new Date().toISOString());\nreturn items;"
},
"id": "n13-log-ok",
"name": "Log \u2014 Healthy",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
900,
540
]
},
{
"parameters": {
"jsCode": "// Alert on health check failure\nconst msg = `[LuxApp] \u26a0\ufe0f Health check FAILED at ${new Date().toISOString()}`;\nconsole.error(msg);\n// TODO: Send Slack/email alert here\nreturn items;"
},
"id": "n14-log-fail",
"name": "Log \u2014 Unhealthy (Alert)",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
900,
660
]
},
{
"parameters": {
"content": "## TheLuxApp AI ChatBot\n\n**Required Environment Variables:**\n- `LUXAPP_BASE_URL` \u2014 e.g. `https://chat.yourdomain.com`\n- `LUXAPP_API_KEY` \u2014 API key from `/auth/api-keys`\n- `LUXAPP_TENANT_ID` \u2014 your tenant UUID\n\n**Webhook URL:** `https://your-n8n.com/webhook/luxapp-chat`\n\n**Test with:**\n```bash\ncurl -X POST https://your-n8n.com/webhook/luxapp-chat \\\n -H 'Content-Type: application/json' \\\n -d '{\"platform\":\"web\",\"userId\":\"u123\",\"message\":\"Hello!\"}'\n```",
"height": 280,
"width": 400
},
"id": "n15-note",
"name": "Setup Instructions",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
240,
760
]
}
],
"connections": {
"Webhook \u2014 Receive Message": {
"main": [
[
{
"node": "Normalise Input",
"type": "main",
"index": 0
}
]
]
},
"Normalise Input": {
"main": [
[
{
"node": "Guard \u2014 Message Not Empty",
"type": "main",
"index": 0
}
]
]
},
"Guard \u2014 Message Not Empty": {
"main": [
[
{
"node": "LuxApp \u2014 Chat Completions API",
"type": "main",
"index": 0
}
],
[
{
"node": "Empty Message Response",
"type": "main",
"index": 0
}
]
]
},
"LuxApp \u2014 Chat Completions API": {
"main": [
[
{
"node": "Check API Response",
"type": "main",
"index": 0
}
]
]
},
"Check API Response": {
"main": [
[
{
"node": "Format Success Response",
"type": "main",
"index": 0
}
],
[
{
"node": "Format Error Response",
"type": "main",
"index": 0
}
]
]
},
"Format Success Response": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Format Error Response": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Empty Message Response": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Schedule \u2014 Hourly Health Check": {
"main": [
[
{
"node": "Health Check",
"type": "main",
"index": 0
}
]
]
},
"Health Check": {
"main": [
[
{
"node": "Health OK?",
"type": "main",
"index": 0
}
]
]
},
"Health OK?": {
"main": [
[
{
"node": "Log \u2014 Healthy",
"type": "main",
"index": 0
}
],
[
{
"node": "Log \u2014 Unhealthy (Alert)",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"saveManualExecutions": true,
"errorWorkflow": "",
"timezone": "UTC"
},
"versionId": "1.0.0",
"id": "theluxapp-master-workflow"
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
TheLuxApp AI ChatBot — Master Workflow. Uses httpRequest. Webhook trigger; 15 nodes.
Source: https://github.com/iboss21/TheLuxApp-Ai-ChatBot/blob/bd84033cb6bdaea87080fd193978df7e54cf8677/n8n/luxapp-workflow.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di
This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .
eek-Go v2 (Batch-Then-Review). Uses httpRequest. Webhook trigger; 75 nodes.
This workflow receives webhook requests from a content calendar and uses the X API v2 to publish text posts, threads, image/video posts, and polls, as well as delete existing posts and run a credentia
This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c