{
  "workflow": {
    "id": 10763,
    "name": "Real-time oil price crisis detection with Qwq-32b AI and multi-channel alerts",
    "views": 92,
    "recentViews": 0,
    "totalViews": 92,
    "createdAt": "2025-11-12T15:26:28.893Z",
    "description": "## How It Works\nScheduled runs collect data from oil markets, global shipping movements, news sources, and official reports. The system performs statistical checks to detect anomalies and volatility shifts. An AI-driven geopolitical model evaluates emerging risks and assigns a crisis score. Based on severity thresholds, results are routed to the appropriate alert channels for rapid response.\n\n## Setup Steps\n\n1. **Data Sources:** Connect the oil price API, OPEC report feeds, shipping databases, and news sources.\n2. **AI Model:** Configure the OpenRouter ChatGPT model for geopolitical and risk analysis.\n3. **Alerts:** Define severity rules and route alerts to Email, Slack, or Dashboard APIs.\n4. **Storage:** Configure a database for historical records, audit logging, and trend tracking.\n\n## Prerequisites\nOil market API credentials; news feed access; OPEC data source; OpenRouter API key; Slack/email/dashboard integrations\n\n## Use Cases\nSupply chain risk monitoring; energy market crisis detection; geopolitical threat assessment; trader decision support; operational risk management\n\n## Customization\nAdjust risk thresholds; add market data sources; modify alert routing rules \n\n## Benefits\nReduces crisis detection lag 90%; consolidates fragmented data; enables proactive response \n\n ",
    "workflow": {
      "id": "GtOVwfzfA4dk0exU",
      "meta": {
        "instanceId": "b91e510ebae4127f953fd2f5f8d40d58ca1e71c746d4500c12ae86aad04c1502",
        "templateCredsSetupCompleted": true
      },
      "name": "Real-Time Oil Price Crisis Detection and Smart Alert System via Qwq-32b",
      "tags": [],
      "nodes": [
        {
          "id": "e63bbdb7-d063-4f97-8eb8-1050bdb82157",
          "name": "Schedule Every 5 Minutes",
          "type": "n8n-nodes-base.scheduleTrigger",
          "position": [
            -2176,
            480
          ],
          "parameters": {
            "rule": {
              "interval": [
                {
                  "field": "minutes"
                }
              ]
            }
          },
          "typeVersion": 1.2
        },
        {
          "id": "0605042b-b18d-491d-9418-89af3a229c1d",
          "name": "Workflow Configuration",
          "type": "n8n-nodes-base.set",
          "position": [
            -1920,
            480
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "id-1",
                  "name": "oilPriceApiUrl",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Oil Price API endpoint URL__>"
                },
                {
                  "id": "id-2",
                  "name": "opecReportsUrl",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__OPEC Reports API endpoint__>"
                },
                {
                  "id": "id-3",
                  "name": "shippingDataUrl",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Shipping Data API endpoint__>"
                },
                {
                  "id": "id-4",
                  "name": "newsApiUrl",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__News API endpoint__>"
                },
                {
                  "id": "id-5",
                  "name": "dashboardApiUrl",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Dashboard API endpoint__>"
                },
                {
                  "id": "id-6",
                  "name": "alertEmailRecipients",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Email addresses for alerts (comma-separated)__>"
                },
                {
                  "id": "id-7",
                  "name": "slackChannel",
                  "type": "string",
                  "value": "<__PLACEHOLDER_VALUE__Slack channel ID for alerts__>"
                },
                {
                  "id": "id-8",
                  "name": "infoThreshold",
                  "type": "number",
                  "value": 30
                },
                {
                  "id": "id-9",
                  "name": "warningThreshold",
                  "type": "number",
                  "value": 60
                },
                {
                  "id": "id-10",
                  "name": "criticalThreshold",
                  "type": "number",
                  "value": 85
                }
              ]
            },
            "includeOtherFields": true
          },
          "typeVersion": 3.4
        },
        {
          "id": "3d1f09cb-e959-493e-9ed1-a792a543783e",
          "name": "Fetch Oil Price Data (API)",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            -1696,
            304
          ],
          "parameters": {
            "url": "={{ $('Workflow Configuration').first().json.oilPriceApiUrl }}",
            "options": {},
            "sendHeaders": true,
            "headerParameters": {
              "parameters": [
                {
                  "name": "Accept",
                  "value": "application/json"
                }
              ]
            }
          },
          "typeVersion": 4.3
        },
        {
          "id": "1b0559d6-7853-436c-91ff-5401ca6fbdbf",
          "name": "Fetch OPEC Reports",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            -1696,
            464
          ],
          "parameters": {
            "url": "={{ $('Workflow Configuration').first().json.opecReportsUrl }}",
            "options": {},
            "sendHeaders": true,
            "headerParameters": {
              "parameters": [
                {
                  "name": "Accept",
                  "value": "application/json"
                }
              ]
            }
          },
          "typeVersion": 4.3
        },
        {
          "id": "db390c16-d4b1-4607-9188-350e700f4595",
          "name": "Fetch Shipping Data",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            -1696,
            592
          ],
          "parameters": {
            "url": "={{ $('Workflow Configuration').first().json.shippingDataUrl }}",
            "options": {},
            "sendHeaders": true,
            "headerParameters": {
              "parameters": [
                {
                  "name": "Accept",
                  "value": "application/json"
                }
              ]
            }
          },
          "typeVersion": 4.3
        },
        {
          "id": "5765af2b-7800-4655-9110-74a4c5018403",
          "name": "Fetch News Feed",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            -1696,
            736
          ],
          "parameters": {
            "url": "={{ $('Workflow Configuration').first().json.newsApiUrl }}",
            "options": {},
            "sendHeaders": true,
            "headerParameters": {
              "parameters": [
                {
                  "name": "Accept",
                  "value": "application/json"
                }
              ]
            }
          },
          "typeVersion": 4.3
        },
        {
          "id": "c629c377-1587-4df6-94b5-c64bf974b256",
          "name": "Merge All Data Sources",
          "type": "n8n-nodes-base.merge",
          "position": [
            -1408,
            432
          ],
          "parameters": {
            "mode": "combine",
            "options": {},
            "combineBy": "combineAll"
          },
          "typeVersion": 3.2
        },
        {
          "id": "d8ebe013-070d-4ea8-9410-5a05aff03dbc",
          "name": "Data Cleaning & Preprocessing",
          "type": "n8n-nodes-base.code",
          "position": [
            -1200,
            432
          ],
          "parameters": {
            "jsCode": "// Data Cleaning & Preprocessing for Oil Price Crisis Detection\n// Handles data from multiple sources: API, OPEC, Shipping, News\n\nconst cleanedData = [];\n\n// Process all input items\nfor (const item of $input.all()) {\n  try {\n    const source = item.json.source || 'unknown';\n    const timestamp = item.json.timestamp || new Date().toISOString();\n    \n    // Standardize timestamp to ISO format\n    let standardizedTimestamp;\n    try {\n      standardizedTimestamp = new Date(timestamp).toISOString();\n    } catch (e) {\n      standardizedTimestamp = new Date().toISOString();\n    }\n    \n    // Initialize cleaned data object\n    const cleanedItem = {\n      timestamp: standardizedTimestamp,\n      source: source,\n      rawData: item.json\n    };\n    \n    // Extract oil price data\n    if (item.json.price !== undefined && item.json.price !== null) {\n      cleanedItem.oilPrice = parseFloat(item.json.price) || 0;\n    } else if (item.json.brent_price !== undefined) {\n      cleanedItem.oilPrice = parseFloat(item.json.brent_price) || 0;\n    } else if (item.json.wti_price !== undefined) {\n      cleanedItem.oilPrice = parseFloat(item.json.wti_price) || 0;\n    }\n    \n    // Extract volume data\n    if (item.json.volume !== undefined && item.json.volume !== null) {\n      cleanedItem.volume = parseFloat(item.json.volume) || 0;\n    } else if (item.json.trading_volume !== undefined) {\n      cleanedItem.volume = parseFloat(item.json.trading_volume) || 0;\n    }\n    \n    // Extract shipping/supply data\n    if (item.json.shipping_volume !== undefined) {\n      cleanedItem.shippingVolume = parseFloat(item.json.shipping_volume) || 0;\n    }\n    if (item.json.supply_disruption !== undefined) {\n      cleanedItem.supplyDisruption = item.json.supply_disruption;\n    }\n    \n    // Extract and analyze news sentiment\n    if (item.json.title || item.json.headline || item.json.text) {\n      const newsText = (item.json.title || item.json.headline || item.json.text || '').toLowerCase();\n      \n      // Simple sentiment analysis based on keywords\n      const negativeKeywords = ['crisis', 'war', 'conflict', 'shortage', 'disruption', 'sanction', 'embargo', 'attack', 'threat'];\n      const positiveKeywords = ['stable', 'agreement', 'peace', 'increase', 'surplus', 'cooperation'];\n      \n      let sentimentScore = 0;\n      negativeKeywords.forEach(keyword => {\n        if (newsText.includes(keyword)) sentimentScore -= 1;\n      });\n      positiveKeywords.forEach(keyword => {\n        if (newsText.includes(keyword)) sentimentScore += 1;\n      });\n      \n      cleanedItem.newsSentiment = sentimentScore;\n      cleanedItem.newsText = item.json.title || item.json.headline || item.json.text;\n    }\n    \n    // Extract geopolitical indicators\n    if (item.json.region !== undefined) {\n      cleanedItem.region = item.json.region;\n    }\n    if (item.json.country !== undefined) {\n      cleanedItem.country = item.json.country;\n    }\n    \n    // Handle missing values - set defaults\n    if (cleanedItem.oilPrice === undefined) {\n      cleanedItem.oilPrice = null;\n    }\n    if (cleanedItem.volume === undefined) {\n      cleanedItem.volume = null;\n    }\n    if (cleanedItem.newsSentiment === undefined) {\n      cleanedItem.newsSentiment = 0;\n    }\n    \n    // Add data quality flag\n    cleanedItem.dataQuality = {\n      hasPriceData: cleanedItem.oilPrice !== null,\n      hasVolumeData: cleanedItem.volume !== null,\n      hasNewsData: cleanedItem.newsText !== undefined,\n      completeness: 0\n    };\n    \n    // Calculate completeness score\n    let completenessCount = 0;\n    if (cleanedItem.oilPrice !== null) completenessCount++;\n    if (cleanedItem.volume !== null) completenessCount++;\n    if (cleanedItem.newsText !== undefined) completenessCount++;\n    cleanedItem.dataQuality.completeness = completenessCount / 3;\n    \n    cleanedData.push(cleanedItem);\n    \n  } catch (error) {\n    console.log('Error processing item:', error.message);\n    // Continue processing other items\n  }\n}\n\n// Return structured data array\nreturn cleanedData.map(item => ({ json: item }));"
          },
          "typeVersion": 2
        },
        {
          "id": "d381a9a2-f656-493c-893f-75a761935888",
          "name": "Statistical Anomaly Detection",
          "type": "n8n-nodes-base.code",
          "position": [
            -896,
            272
          ],
          "parameters": {
            "jsCode": "// Statistical Anomaly Detection for Oil Price Crisis Detection\n// Implements Z-score, moving average, volatility, and spike detection\n\nconst items = $input.all();\n\n// Helper function to calculate mean\nfunction calculateMean(values) {\n  return values.reduce((sum, val) => sum + val, 0) / values.length;\n}\n\n// Helper function to calculate standard deviation\nfunction calculateStdDev(values, mean) {\n  const squaredDiffs = values.map(val => Math.pow(val - mean, 2));\n  const variance = squaredDiffs.reduce((sum, val) => sum + val, 0) / values.length;\n  return Math.sqrt(variance);\n}\n\n// Helper function to calculate Z-score\nfunction calculateZScore(value, mean, stdDev) {\n  if (stdDev === 0) return 0;\n  return (value - mean) / stdDev;\n}\n\n// Helper function to calculate moving average\nfunction calculateMovingAverage(values, window = 5) {\n  if (values.length < window) return calculateMean(values);\n  const recentValues = values.slice(-window);\n  return calculateMean(recentValues);\n}\n\n// Extract price data from items\nconst priceData = items.map(item => ({\n  price: parseFloat(item.json.price || item.json.oilPrice || 0),\n  volume: parseFloat(item.json.volume || item.json.tradingVolume || 0),\n  timestamp: item.json.timestamp || new Date().toISOString()\n}));\n\n// Calculate statistics\nconst prices = priceData.map(d => d.price);\nconst volumes = priceData.map(d => d.volume);\n\nconst priceMean = calculateMean(prices);\nconst priceStdDev = calculateStdDev(prices, priceMean);\nconst volumeMean = calculateMean(volumes);\nconst volumeStdDev = calculateStdDev(volumes, volumeMean);\n\n// Calculate moving average (5-period)\nconst movingAverage = calculateMovingAverage(prices, 5);\n\n// Get current (latest) values\nconst currentPrice = prices[prices.length - 1];\nconst previousPrice = prices.length > 1 ? prices[prices.length - 2] : currentPrice;\nconst currentVolume = volumes[volumes.length - 1];\n\n// Calculate price change percentage\nconst priceChangePercent = previousPrice !== 0 \n  ? ((currentPrice - previousPrice) / previousPrice) * 100 \n  : 0;\n\n// Calculate Z-scores\nconst priceZScore = calculateZScore(currentPrice, priceMean, priceStdDev);\nconst volumeZScore = calculateZScore(currentVolume, volumeMean, volumeStdDev);\n\n// Calculate price volatility (coefficient of variation)\nconst priceVolatility = priceMean !== 0 ? (priceStdDev / priceMean) * 100 : 0;\n\n// Detect anomalies\nconst suddenPriceChange = Math.abs(priceChangePercent) > 5;\nconst volumeSpike = Math.abs(volumeZScore) > 2;\nconst priceAnomaly = Math.abs(priceZScore) > 2;\nconst highVolatility = priceVolatility > 10;\n\n// Calculate composite anomaly score (0-100)\nlet anomalyScore = 0;\n\n// Price Z-score contribution (0-30 points)\nanomalyScore += Math.min(Math.abs(priceZScore) * 10, 30);\n\n// Sudden price change contribution (0-25 points)\nif (suddenPriceChange) {\n  anomalyScore += Math.min(Math.abs(priceChangePercent) * 2, 25);\n}\n\n// Volume spike contribution (0-25 points)\nif (volumeSpike) {\n  anomalyScore += Math.min(Math.abs(volumeZScore) * 8, 25);\n}\n\n// Volatility contribution (0-20 points)\nanomalyScore += Math.min(priceVolatility * 2, 20);\n\n// Cap at 100\nanomalyScore = Math.min(anomalyScore, 100);\n\n// Determine overall anomaly flag\nconst isAnomaly = anomalyScore > 50 || suddenPriceChange || (priceAnomaly && volumeSpike);\n\n// Return enriched data with anomaly detection results\nreturn [{\n  json: {\n    // Original data\n    ...items[items.length - 1].json,\n    \n    // Statistical metrics\n    statistics: {\n      priceMean: priceMean.toFixed(2),\n      priceStdDev: priceStdDev.toFixed(2),\n      movingAverage: movingAverage.toFixed(2),\n      priceVolatility: priceVolatility.toFixed(2),\n      volumeMean: volumeMean.toFixed(2),\n      volumeStdDev: volumeStdDev.toFixed(2)\n    },\n    \n    // Current values\n    currentMetrics: {\n      price: currentPrice,\n      previousPrice: previousPrice,\n      priceChangePercent: priceChangePercent.toFixed(2),\n      volume: currentVolume,\n      priceZScore: priceZScore.toFixed(2),\n      volumeZScore: volumeZScore.toFixed(2)\n    },\n    \n    // Anomaly detection results\n    anomalyDetection: {\n      anomalyScore: Math.round(anomalyScore),\n      isAnomaly: isAnomaly,\n      flags: {\n        suddenPriceChange: suddenPriceChange,\n        volumeSpike: volumeSpike,\n        priceAnomaly: priceAnomaly,\n        highVolatility: highVolatility\n      },\n      details: {\n        priceChangeDetected: suddenPriceChange ? `${priceChangePercent.toFixed(2)}% change detected` : 'Normal',\n        volumeStatus: volumeSpike ? 'Volume spike detected' : 'Normal',\n        priceStatus: priceAnomaly ? 'Price anomaly detected' : 'Normal',\n        volatilityStatus: highVolatility ? 'High volatility' : 'Normal'\n      }\n    },\n    \n    // Timestamp\n    analysisTimestamp: new Date().toISOString()\n  }\n}];"
          },
          "typeVersion": 2
        },
        {
          "id": "44984f6f-6894-485f-8dfa-95f6b8710028",
          "name": "AI Trend & Geopolitical Analyzer",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            -928,
            656
          ],
          "parameters": {
            "text": "=Analyze the following oil market data for geopolitical risks, supply disruptions, and crisis indicators. Consider: 1) News sentiment and geopolitical events, 2) OPEC production changes, 3) Shipping disruptions, 4) Historical patterns. Provide a risk assessment score (0-100) and key risk factors. Data: {{ JSON.stringify($json) }}",
            "options": {},
            "promptType": "define"
          },
          "typeVersion": 3
        },
        {
          "id": "5a9fbd66-5014-4b87-a82e-33eb701282a6",
          "name": "Calculate Crisis Risk Score",
          "type": "n8n-nodes-base.code",
          "position": [
            -592,
            400
          ],
          "parameters": {
            "jsCode": "// Calculate Comprehensive Crisis Risk Score\n// Combines multiple data sources with weighted scoring\n\nconst items = $input.all();\nconst results = [];\n\nfor (const item of items) {\n  const data = item.json;\n  \n  // Extract scores from previous nodes\n  const statisticalAnomalyScore = data.anomalyScore || 0;\n  const aiGeopoliticalScore = data.geopoliticalRiskScore || 0;\n  const priceVolatility = data.priceVolatility || 0;\n  const volumeChange = data.volumeChange || 0;\n  \n  // Normalize all scores to 0-100 scale if needed\n  const normalizedStatistical = Math.min(Math.max(statisticalAnomalyScore, 0), 100);\n  const normalizedGeopolitical = Math.min(Math.max(aiGeopoliticalScore, 0), 100);\n  const normalizedVolatility = Math.min(Math.max(priceVolatility, 0), 100);\n  const normalizedVolume = Math.min(Math.max(volumeChange, 0), 100);\n  \n  // Calculate weighted crisis risk score\n  const crisisRiskScore = (\n    (normalizedStatistical * 0.40) +\n    (normalizedGeopolitical * 0.40) +\n    (normalizedVolatility * 0.10) +\n    (normalizedVolume * 0.10)\n  );\n  \n  // Round to 2 decimal places\n  const finalScore = Math.round(crisisRiskScore * 100) / 100;\n  \n  // Determine alert level based on score\n  let alertLevel;\n  if (finalScore >= 70) {\n    alertLevel = 'critical';\n  } else if (finalScore >= 40) {\n    alertLevel = 'warning';\n  } else {\n    alertLevel = 'info';\n  }\n  \n  // Create detailed breakdown\n  const breakdown = {\n    statisticalAnomaly: {\n      score: normalizedStatistical,\n      weight: '40%',\n      contribution: Math.round(normalizedStatistical * 0.40 * 100) / 100\n    },\n    geopoliticalRisk: {\n      score: normalizedGeopolitical,\n      weight: '40%',\n      contribution: Math.round(normalizedGeopolitical * 0.40 * 100) / 100\n    },\n    priceVolatility: {\n      score: normalizedVolatility,\n      weight: '10%',\n      contribution: Math.round(normalizedVolatility * 0.10 * 100) / 100\n    },\n    volumeChanges: {\n      score: normalizedVolume,\n      weight: '10%',\n      contribution: Math.round(normalizedVolume * 0.10 * 100) / 100\n    }\n  };\n  \n  // Return comprehensive result\n  results.push({\n    json: {\n      ...data,\n      crisisRiskScore: finalScore,\n      alertLevel: alertLevel,\n      scoreBreakdown: breakdown,\n      timestamp: new Date().toISOString(),\n      scoringMethod: 'weighted_composite'\n    }\n  });\n}\n\nreturn results;"
          },
          "typeVersion": 2
        },
        {
          "id": "f2612ed5-0943-4b8e-b480-47a9d85ebb66",
          "name": "Route by Alert Level",
          "type": "n8n-nodes-base.switch",
          "position": [
            -352,
            496
          ],
          "parameters": {
            "rules": {
              "values": [
                {
                  "outputKey": "Info",
                  "conditions": {
                    "options": {
                      "leftValue": "",
                      "caseSensitive": true,
                      "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                      {
                        "id": "id-1",
                        "operator": {
                          "type": "number",
                          "operation": "lt"
                        },
                        "leftValue": "={{ $json.riskScore }}",
                        "rightValue": "={{ $('Workflow Configuration').first().json.warningThreshold }}"
                      }
                    ]
                  },
                  "renameOutput": true
                },
                {
                  "outputKey": "Warning",
                  "conditions": {
                    "options": {
                      "leftValue": "",
                      "caseSensitive": true,
                      "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                      {
                        "id": "id-2",
                        "operator": {
                          "type": "number",
                          "operation": "gte"
                        },
                        "leftValue": "={{ $json.riskScore }}",
                        "rightValue": "={{ $('Workflow Configuration').first().json.warningThreshold }}"
                      },
                      {
                        "id": "id-3",
                        "operator": {
                          "type": "number",
                          "operation": "lt"
                        },
                        "leftValue": "={{ $json.riskScore }}",
                        "rightValue": "={{ $('Workflow Configuration').first().json.criticalThreshold }}"
                      }
                    ]
                  },
                  "renameOutput": true
                },
                {
                  "outputKey": "Critical",
                  "conditions": {
                    "options": {
                      "leftValue": "",
                      "caseSensitive": true,
                      "typeValidation": "strict"
                    },
                    "combinator": "and",
                    "conditions": [
                      {
                        "id": "id-4",
                        "operator": {
                          "type": "number",
                          "operation": "gte"
                        },
                        "leftValue": "={{ $json.riskScore }}",
                        "rightValue": "={{ $('Workflow Configuration').first().json.criticalThreshold }}"
                      }
                    ]
                  },
                  "renameOutput": true
                }
              ]
            },
            "options": {}
          },
          "typeVersion": 3.3
        },
        {
          "id": "e8a59011-bdd3-4ba8-bfd4-3e1d586112e2",
          "name": "Format Info Alert",
          "type": "n8n-nodes-base.set",
          "position": [
            -128,
            336
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "id-1",
                  "name": "alertLevel",
                  "type": "string",
                  "value": "INFO"
                },
                {
                  "id": "id-2",
                  "name": "alertTitle",
                  "type": "string",
                  "value": "Oil Market Update"
                },
                {
                  "id": "id-3",
                  "name": "alertMessage",
                  "type": "string",
                  "value": "=Risk Score: {{ $json.riskScore }} - {{ $json.summary }}"
                },
                {
                  "id": "id-4",
                  "name": "timestamp",
                  "type": "string",
                  "value": "={{ $now.toISO() }}"
                },
                {
                  "id": "id-5",
                  "name": "color",
                  "type": "string",
                  "value": "#17a2b8"
                }
              ]
            }
          },
          "typeVersion": 3.4
        },
        {
          "id": "8833b06e-b711-49da-a213-d6d59547d785",
          "name": "Format Warning Alert",
          "type": "n8n-nodes-base.set",
          "position": [
            -128,
            480
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "id-1",
                  "name": "alertLevel",
                  "type": "string",
                  "value": "WARNING"
                },
                {
                  "id": "id-2",
                  "name": "alertTitle",
                  "type": "string",
                  "value": "⚠️ Oil Market Warning Alert"
                },
                {
                  "id": "id-3",
                  "name": "alertMessage",
                  "type": "string",
                  "value": "=Risk Score: {{ $json.riskScore }} - {{ $json.summary }}. Factors: {{ $json.riskFactors }}"
                },
                {
                  "id": "id-4",
                  "name": "timestamp",
                  "type": "string",
                  "value": "={{ $now.toISO() }}"
                },
                {
                  "id": "id-5",
                  "name": "color",
                  "type": "string",
                  "value": "#ffc107"
                }
              ]
            }
          },
          "typeVersion": 3.4
        },
        {
          "id": "b912a259-b218-4ea7-9fc9-2cfb800ff5f6",
          "name": "Format Critical Alert",
          "type": "n8n-nodes-base.set",
          "position": [
            -128,
            640
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "id-1",
                  "name": "alertLevel",
                  "type": "string",
                  "value": "CRITICAL"
                },
                {
                  "id": "id-2",
                  "name": "alertTitle",
                  "type": "string",
                  "value": "🚨 CRITICAL Oil Market Crisis Alert"
                },
                {
                  "id": "id-3",
                  "name": "alertMessage",
                  "type": "string",
                  "value": "=URGENT - Risk Score: {{ $json.riskScore }} - {{ $json.summary }}. Immediate action required. Factors: {{ $json.riskFactors }}"
                },
                {
                  "id": "id-4",
                  "name": "timestamp",
                  "type": "string",
                  "value": "={{ $now.toISO() }}"
                },
                {
                  "id": "id-5",
                  "name": "color",
                  "type": "string",
                  "value": "#dc3545"
                }
              ]
            }
          },
          "typeVersion": 3.4
        },
        {
          "id": "59216b80-04b3-401a-806c-1a8b994c9734",
          "name": "Send Email Alert",
          "type": "n8n-nodes-base.gmail",
          "position": [
            176,
            400
          ],
          "webhookId": "c0f256fd-dce1-4430-86e6-f93d9f65010a",
          "parameters": {
            "sendTo": "={{ $('Workflow Configuration').first().json.alertEmailRecipients }}",
            "message": "=<h2>{{ $json.alertTitle }}</h2><p>{{ $json.alertMessage }}</p><p><strong>Timestamp:</strong> {{ $json.timestamp }}</p><p><strong>Details:</strong> {{ JSON.stringify($json, null, 2) }}</p>",
            "options": {},
            "subject": "={{ $json.alertTitle }}"
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 2.1
        },
        {
          "id": "6bba8b1d-6bdc-4a53-9910-49e795c5a23b",
          "name": "Send Slack Alert",
          "type": "n8n-nodes-base.slack",
          "position": [
            192,
            576
          ],
          "webhookId": "d0454b22-335a-4e80-aa15-19c3e1ce50c2",
          "parameters": {
            "select": "channel",
            "channelId": {
              "__rl": true,
              "mode": "id",
              "value": "={{ $('Workflow Configuration').first().json.slackChannel }}"
            },
            "attachments": [
              {
                "text": "={{ $json.alertTitle }}\n{{ $json.alertMessage }}\nTimestamp: {{ $json.timestamp }}",
                "color": "={{ $json.color }}",
                "fallback": "Alert Notification"
              }
            ],
            "messageType": "attachment",
            "otherOptions": {},
            "authentication": "oAuth2"
          },
          "credentials": {
            "slackOAuth2Api": {
              "id": "credential-id",
              "name": "slackOAuth2Api Credential"
            }
          },
          "typeVersion": 2.3
        },
        {
          "id": "360d44b6-be4b-4d9e-99a7-29b0cad84364",
          "name": "Store Alert History",
          "type": "n8n-nodes-base.postgres",
          "position": [
            240,
            64
          ],
          "parameters": {
            "table": {
              "__rl": true,
              "mode": "name",
              "value": "alert_history"
            },
            "schema": {
              "__rl": true,
              "mode": "list",
              "value": "public"
            },
            "columns": {
              "value": {},
              "mappingMode": "autoMapInputData"
            },
            "options": {}
          },
          "typeVersion": 2.6
        },
        {
          "id": "1d8ffdde-0611-478b-bac4-8d861234528a",
          "name": "Send to Dashboard API",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            64,
            64
          ],
          "parameters": {
            "url": "={{ $('Workflow Configuration').first().json.dashboardApiUrl }}",
            "method": "POST",
            "options": {},
            "jsonBody": "={{ $json }}",
            "sendBody": true,
            "sendHeaders": true,
            "specifyBody": "json",
            "headerParameters": {
              "parameters": [
                {
                  "name": "Content-Type",
                  "value": "application/json"
                }
              ]
            }
          },
          "typeVersion": 4.3
        },
        {
          "id": "0fad6e92-4d61-4b28-9951-714e23dffd6b",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2224,
            -160
          ],
          "parameters": {
            "width": 336,
            "height": 336,
            "content": "## How It Works\nScheduled runs collect data from oil markets, global shipping movements, news sources, and official reports. The system performs statistical checks to detect anomalies and volatility shifts. An AI-driven geopolitical model evaluates emerging risks and assigns a crisis score. Based on severity thresholds, results are routed to the appropriate alert channels for rapid response."
          },
          "typeVersion": 1
        },
        {
          "id": "9019b097-ef4c-4c90-a96c-1d02bd941659",
          "name": "Sticky Note2",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1872,
            -160
          ],
          "parameters": {
            "width": 464,
            "height": 272,
            "content": "## Setup Steps\n1. **Data Sources:** Connect the oil price API, OPEC report feeds, shipping databases, and news sources.\n2. **AI Model:** Configure the OpenRouter ChatGPT model for geopolitical and risk analysis.\n3. **Alerts:** Define severity rules and route alerts to Email, Slack, or Dashboard APIs.\n4. **Storage:** Configure a database for historical records, audit logging, and trend tracking."
          },
          "typeVersion": 1
        },
        {
          "id": "1125bbc0-11b7-464b-b475-252b593719ec",
          "name": "Sticky Note4",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1376,
            -144
          ],
          "parameters": {
            "color": 6,
            "width": 672,
            "height": 208,
            "content": "\n## Prerequisites\nOil market API credentials; news feed access; OPEC data source; OpenRouter API key; Slack/email/dashboard integrations\n\n## Use Cases\nSupply chain risk monitoring; energy market crisis detection; geopolitical threat assessment; trader decision support; operational risk management"
          },
          "typeVersion": 1
        },
        {
          "id": "d724f033-8c42-4d3e-b95b-1104e6a68985",
          "name": "OpenRouter Chat Model",
          "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
          "position": [
            -928,
            800
          ],
          "parameters": {
            "model": "qwen/qwq-32b",
            "options": {}
          },
          "credentials": {
            "openRouterApi": {
              "id": "credential-id",
              "name": "openRouterApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "5af012b5-81f3-4624-825d-e32befc29e70",
          "name": "Sticky Note5",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -672,
            -144
          ],
          "parameters": {
            "color": 3,
            "width": 624,
            "height": 192,
            "content": "## Customization\nAdjust risk thresholds; add market data sources; modify alert routing rules \n\n## Benefits\nReduces crisis detection lag 90%; consolidates fragmented data; enables proactive response "
          },
          "typeVersion": 1
        },
        {
          "id": "968857a5-92e6-4b8b-9b23-d02acbf84685",
          "name": "Sticky Note1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -2224,
            192
          ],
          "parameters": {
            "color": 7,
            "width": 224,
            "height": 496,
            "content": "## Schedule Data Collection\nTriggers workflow every 5 minutes to fetch oil markets, OPEC reports, shipping data, news feeds\nWhy: 5-minute cadence catches early warnings before markets react"
          },
          "typeVersion": 1
        },
        {
          "id": "096bb892-a30a-42f1-ab45-5c131e5256a9",
          "name": "Sticky Note3",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1488,
            192
          ],
          "parameters": {
            "color": 7,
            "width": 256,
            "height": 416,
            "content": "## Aggregate Shipping Data\nCollects vessel tracking, route changes, port delays, freight costs\nWhy: Shipping delays signal supply disruptions or geopolitical tensions before announcements"
          },
          "typeVersion": 1
        },
        {
          "id": "9c572d55-c40a-411e-ae34-09c6828baf87",
          "name": "Sticky Note6",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1968,
            192
          ],
          "parameters": {
            "color": 7,
            "width": 464,
            "height": 688,
            "content": "## Fetch Oil Price Data\nRetrieves spot prices, futures, contract rates from multiple exchanges\nWhy: Oil prices move first in crises; multiple sources catch geographic and contract divergence"
          },
          "typeVersion": 1
        },
        {
          "id": "cc635d3b-3751-443c-9e89-4690584e4a77",
          "name": "Sticky Note7",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1216,
            192
          ],
          "parameters": {
            "color": 7,
            "width": 224,
            "height": 464,
            "content": "##  Clean Multi-Source Data\nStandardizes oil prices, shipping metrics, dates, timestamps into unified schema\nWhy: Fragmented data prevents analysis"
          },
          "typeVersion": 1
        },
        {
          "id": "55123cd3-ccb6-49ad-abf1-0a92c6526eba",
          "name": "Sticky Note8",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -976,
            80
          ],
          "parameters": {
            "color": 7,
            "width": 320,
            "height": 336,
            "content": "## Statistical Anomaly Detection\nIdentifies unusual shifts: price volatility spikes, shipping jumps, OPEC deviations, news volume surges\nWhy: Quantitative anomalies flag problems objectively \n"
          },
          "typeVersion": 1
        },
        {
          "id": "b19afa6f-008c-4e56-8fb8-75901269fec3",
          "name": "Sticky Note9",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -976,
            432
          ],
          "parameters": {
            "color": 7,
            "width": 320,
            "height": 512,
            "content": "## AI Crisis Risk Model\nUses Claude to analyze geopolitical tensions, sanctions risk\nWhy: AI connects disparate signals into coherent risk narrative; combines quantitative anomalies with context"
          },
          "typeVersion": 1
        },
        {
          "id": "90af94d4-ca13-4d6a-84fe-fadf4b03c6f4",
          "name": "Sticky Note10",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -640,
            144
          ],
          "parameters": {
            "color": 7,
            "height": 448,
            "content": "\n## Score Emerging Threats\nAssigns crisis risk rating: threat probability, impact, time horizon\nWhy: Scoring prioritizes analyst time on highest-threat scenarios"
          },
          "typeVersion": 1
        },
        {
          "id": "db334106-5b75-452c-b5de-1d084ef08267",
          "name": "Sticky Note11",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -384,
            144
          ],
          "parameters": {
            "color": 7,
            "width": 384,
            "height": 688,
            "content": "## Route Critical Alerts to Traders\nSends high-risk signals (8-10 severity) immediately via Slack and dashboard\nWhy: Traders need sub-minute warnings to adjust positions; speed determines profit/loss"
          },
          "typeVersion": 1
        },
        {
          "id": "0643b2b5-13f4-4437-badc-61878b0aec03",
          "name": "Sticky Note12",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            16,
            -112
          ],
          "parameters": {
            "color": 7,
            "width": 432,
            "height": 320,
            "content": "## Alerts to Dashboard & Storage\nPosts lower-severity signals (1-4) to dashboard for shift review\nWhy: Lower-risk items inform strategy without urgent action; creates searchable record"
          },
          "typeVersion": 1
        },
        {
          "id": "52f35260-0719-48dc-aa3d-877a90f1eb35",
          "name": "Sticky Note13",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            32,
            224
          ],
          "parameters": {
            "color": 7,
            "width": 416,
            "height": 528,
            "content": "\n## Alert to Email & Slack\nLogs alerts with timestamps, reasoning, sources, routing decisions\nWhy: Regulators require monitoring evidence; audit trail proves due diligence"
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "b07a4dc6-2c1b-4584-ab5f-414cc35d0484",
      "connections": {
        "Format Info Alert": {
          "main": [
            [
              {
                "node": "Send to Dashboard API",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch OPEC Reports": {
          "main": [
            [
              {
                "node": "Merge All Data Sources",
                "type": "main",
                "index": 1
              }
            ]
          ]
        },
        "Format Warning Alert": {
          "main": [
            [
              {
                "node": "Send Email Alert",
                "type": "main",
                "index": 0
              },
              {
                "node": "Send Slack Alert",
                "type": "main",
                "index": 0
              },
              {
                "node": "Send to Dashboard API",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Route by Alert Level": {
          "main": [
            [
              {
                "node": "Format Info Alert",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Format Warning Alert",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "Format Critical Alert",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Critical Alert": {
          "main": [
            [
              {
                "node": "Send Email Alert",
                "type": "main",
                "index": 0
              },
              {
                "node": "Send Slack Alert",
                "type": "main",
                "index": 0
              },
              {
                "node": "Send to Dashboard API",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "OpenRouter Chat Model": {
          "ai_languageModel": [
            [
              {
                "node": "AI Trend & Geopolitical Analyzer",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "Send to Dashboard API": {
          "main": [
            [
              {
                "node": "Store Alert History",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Merge All Data Sources": {
          "main": [
            [
              {
                "node": "Data Cleaning & Preprocessing",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Workflow Configuration": {
          "main": [
            [
              {
                "node": "Fetch Oil Price Data (API)",
                "type": "main",
                "index": 0
              },
              {
                "node": "Fetch OPEC Reports",
                "type": "main",
                "index": 0
              },
              {
                "node": "Fetch Shipping Data",
                "type": "main",
                "index": 0
              },
              {
                "node": "Fetch News Feed",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Schedule Every 5 Minutes": {
          "main": [
            [
              {
                "node": "Workflow Configuration",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch Oil Price Data (API)": {
          "main": [
            [
              {
                "node": "Merge All Data Sources",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Calculate Crisis Risk Score": {
          "main": [
            [
              {
                "node": "Route by Alert Level",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Data Cleaning & Preprocessing": {
          "main": [
            [
              {
                "node": "Statistical Anomaly Detection",
                "type": "main",
                "index": 0
              },
              {
                "node": "AI Trend & Geopolitical Analyzer",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Statistical Anomaly Detection": {
          "main": [
            [
              {
                "node": "Calculate Crisis Risk Score",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "AI Trend & Geopolitical Analyzer": {
          "main": [
            [
              {
                "node": "Calculate Crisis Risk Score",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 1,
    "workflowInfo": {
      "nodeCount": 34,
      "nodeTypes": {
        "n8n-nodes-base.set": {
          "count": 4
        },
        "n8n-nodes-base.code": {
          "count": 3
        },
        "n8n-nodes-base.gmail": {
          "count": 1
        },
        "n8n-nodes-base.merge": {
          "count": 1
        },
        "n8n-nodes-base.slack": {
          "count": 1
        },
        "n8n-nodes-base.switch": {
          "count": 1
        },
        "n8n-nodes-base.postgres": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 14
        },
        "n8n-nodes-base.httpRequest": {
          "count": 5
        },
        "@n8n/n8n-nodes-langchain.agent": {
          "count": 1
        },
        "n8n-nodes-base.scheduleTrigger": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.lmChatOpenRouter": {
          "count": 1
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Cheng Siong Chin",
      "username": "cschin",
      "bio": "Dr. Cheng Siong CHIN is an n8n workflow creator specializing in AI-powered automation, agent orchestration, and intelligent system integrations. He designs and builds end-to-end workflows that combine LLMs, APIs, and data pipelines to streamline complex processes and deliver production-ready automation solutions. Contact me to discuss custom AI workflows and agent architectures.\n",
      "verified": true,
      "links": [
        "https://gravatar.com/mysticluminary9fa255f7f5"
      ],
      "avatar": "https://gravatar.com/avatar/54544f98e839bb9dd9a764ad1e6823eeddb6db5138d201e42f291a7b0a73303f?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 19,
        "icon": "file:httprequest.svg",
        "name": "n8n-nodes-base.httpRequest",
        "codex": {
          "data": {
            "alias": [
              "API",
              "Request",
              "URL",
              "Build",
              "cURL"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/",
                  "icon": "✍️",
                  "label": "Learn how to automatically cross-post your content with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/",
                  "icon": " 🪢",
                  "label": "What are APIs and how to use them with no code"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/world-poetry-day-workflow/",
                  "icon": "📜",
                  "label": "Celebrating World Poetry Day with a daily poem in Telegram"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/automate-designs-with-bannerbear-and-n8n/",
                  "icon": "🎨",
                  "label": "Automate Designs with Bannerbear and n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/",
                  "icon": "🧰",
                  "label": "How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"
                },
                {
                  "url": "https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/",
                  "icon": "🦄",
                  "label": "Learn how to use webhooks with Mattermost slash commands"
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                },
                {
                  "url": "https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/",
                  "icon": "🤟",
                  "label": "Creating scheduled text affirmations with n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "HTTP Request",
          "color": "#0004F5"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="
        },
        "displayName": "HTTP Request",
        "typeVersion": 4,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 24,
        "icon": "file:merge.svg",
        "name": "n8n-nodes-base.merge",
        "codex": {
          "data": {
            "alias": [
              "Join",
              "Concatenate",
              "Wait"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/how-to-sync-data-between-two-systems/",
                  "icon": "🏬",
                  "label": "How to synchronize data between two systems (one-way vs. two-way sync"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Merge"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Merge",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 30,
        "icon": "file:postgres.svg",
        "name": "n8n-nodes-base.postgres",
        "codex": {
          "data": {
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/",
                  "icon": "❤️",
                  "label": "Love at first sight: Ricardo’s n8n journey"
                },
                {
                  "url": "https://n8n.io/blog/why-i-chose-n8n-over-zapier-in-2020/",
                  "icon": "😍",
                  "label": "Why I chose n8n over Zapier in 2020"
                },
                {
                  "url": "https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/",
                  "icon": "📡",
                  "label": "Database Monitoring and Alerting with n8n"
                },
                {
                  "url": "https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/",
                  "icon": "🛳",
                  "label": "Running n8n on ships: An interview with Maranics"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/",
                  "icon": "🍔",
                  "label": "How Honest Burgers Use Automation to Save $100k per year"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.postgres/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/postgres/"
                }
              ]
            },
            "categories": [
              "Development",
              "Data & Storage"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Postgres"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNzkgODEiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwMCIgZD0iTTc3LjM5MSA0Ny45MjJjLS40NjYtMS40MTItMS42ODgtMi4zOTYtMy4yNjgtMi42MzItLjc0NS0uMTExLTEuNTk4LS4wNjQtMi42MDguMTQ0LTEuNzYuMzYzLTMuMDY1LjUwMS00LjAxOC41MjggMy41OTYtNi4wNzIgNi41MjEtMTIuOTk3IDguMjA0LTE5LjUxNSAyLjcyMi0xMC41NCAxLjI2OC0xNS4zNDEtLjQzMi0xNy41MTNDNzAuNzcgMy4xODUgNjQuMjA2LjA5NyA1Ni4yODcuMDAyYy00LjIyNC0uMDUyLTcuOTMzLjc4Mi05Ljg2NyAxLjM4MmEzNyAzNyAwIDAgMC01Ljc3LS41MjhjLTMuODA5LS4wNjEtNy4xNzQuNzctMTAuMDUgMi40NzZhNDYgNDYgMCAwIDAtNy4wOTgtMS43ODJDMTYuNTYxLjQxMSAxMC45NjggMS4yOTkgNi44NzYgNC4xOSAxLjkyMiA3LjY4OS0uMzc1IDEzLjc3LjA1IDIyLjI2MmMuMTM1IDIuNjk2IDEuNjQzIDEwLjkgNC4wMTggMTguNjggMS4zNjUgNC40NzIgMi44MiA4LjE4NSA0LjMyNiAxMS4wMzggMi4xMzUgNC4wNDYgNC40MTkgNi40MjggNi45ODQgNy4yODQgMS40MzguNDc5IDQuMDQ5LjgxNCA2Ljc5Ny0xLjQ3M2E2IDYgMCAwIDAgMS40MjkgMS4yM2MuNzgzLjQ5NCAxLjc0Ljg5NyAyLjY5NiAxLjEzNiAzLjQ0Ni44NjIgNi42NzQuNjQ2IDkuNDI3LS41NjFsLjA0MSAxLjM2Mi4wNiAxLjg5OWMuMTYzIDQuMDY0LjQ0IDcuMjIzIDEuMjU5IDkuNDM0LjA0NS4xMjIuMTA1LjMwNy4xNjkuNTAzLjQwOSAxLjI1MSAxLjA5MiAzLjM0NiAyLjgzIDQuOTg3IDEuOCAxLjY5OSAzLjk3OCAyLjIyIDUuOTcyIDIuMjIgMSAwIDEuOTU1LS4xMzEgMi43OTItLjMxMSAyLjk4NC0uNjM5IDYuMzczLTEuNjE0IDguODI0LTUuMTA0IDIuMzE4LTMuMyAzLjQ0NC04LjI3IDMuNjQ4LTE2LjEwMWwuMDc0LS42MzQuMDQ4LS40MTQuNTQ2LjA0OC4xNDEuMDFjMy4wMzkuMTM4IDYuNzU1LS41MDYgOS4wMzctMS41NjYgMS44MDMtLjgzNyA3LjU4Mi0zLjg4OCA2LjIyMS04LjAwNyIvPjxwYXRoIGZpbGw9IiMzMzY3OTEiIGQ9Ik03Mi4xOTUgNDguNzIzYy05LjAzNiAxLjg2NC05LjY1Ny0xLjE5NS05LjY1Ny0xLjE5NSA5LjU0MS0xNC4xNTcgMTMuNTI5LTMyLjEyNyAxMC4wODctMzYuNTI1QzYzLjIzNS0uOTk0IDQ2Ljk4MSA0LjY4IDQ2LjcxIDQuODI3bC0uMDg3LjAxNmMtMS43ODUtLjM3MS0zLjc4My0uNTkxLTYuMDI5LS42MjgtNC4wODktLjA2Ny03LjE5IDEuMDcyLTkuNTQ0IDIuODU3IDAgMC0yOC45OTUtMTEuOTQ1LTI3LjY0NyAxNS4wMjMuMjg3IDUuNzM3IDguMjIzIDQzLjQxIDE3LjY4OSAzMi4wMzEgMy40Ni00LjE2MSA2LjgwMy03LjY3OSA2LjgwMy03LjY3OSAxLjY2IDEuMTAzIDMuNjQ4IDEuNjY2IDUuNzMyIDEuNDYzbC4xNjItLjEzN2E2LjMgNi4zIDAgMCAwIC4wNjUgMS42MmMtMi40MzkgMi43MjUtMS43MjIgMy4yMDMtNi41OTcgNC4yMDYtNC45MzMgMS4wMTctMi4wMzUgMi44MjYtLjE0MyAzLjI5OSAyLjI5NC41NzQgNy42IDEuMzg2IDExLjE4NS0zLjYzM2wtLjE0My41NzNjLjk1Ni43NjUgMS42MjYgNC45NzggMS41MTQgOC43OTdzLS4xODggNi40NDEuNTY1IDguNDg5IDEuNTAzIDYuNjU2IDcuOTEyIDUuMjgyYzUuMzU1LTEuMTQ4IDguMTMtNC4xMjEgOC41MTYtOS4wODEuMjc0LTMuNTI2Ljg5NC0zLjAwNS45MzMtNi4xNThsLjQ5Ny0xLjQ5M2MuNTczLTQuNzguMDkxLTYuMzIyIDMuMzktNS42MDVsLjgwMi4wN2MyLjQyOC4xMSA1LjYwNi0uMzkxIDcuNDcxLTEuMjU3IDQuMDE2LTEuODY0IDYuMzk4LTQuOTc2IDIuNDM4LTQuMTU4Ii8+PHBhdGggZD0iTTMyLjc0NyAyNC42NmMtLjgxNC0uMTEzLTEuNTUyLS4wMDgtMS45MjUuMjc0YS43LjcgMCAwIDAtLjI5Mi40N2MtLjA0Ny4zMzYuMTg4LjcwNy4zMzMuODk4LjQwOS41NDIgMS4wMDYuOTE1IDEuNTk4Ljk5N2EyIDIgMCAwIDAgLjI1Ni4wMThjLjk4NiAwIDEuODgzLS43NjggMS45NjItMS4zMzUuMDk5LS43MS0uOTMyLTEuMTgzLTEuOTMxLTEuMzIybTI2Ljk3NS4wMjJjLS4wNzgtLjU1Ni0xLjA2OC0uNzE1LTIuMDA3LS41ODRzLTEuODQ4LjU1NC0xLjc3MiAxLjExMmMuMDYxLjQzNC44NDQgMS4xNzQgMS43NzEgMS4xNzRxLjExNyAwIC4yMzctLjAxNmMuNjE5LS4wODYgMS4wNzMtLjQ3OSAxLjI4OC0uNzA1LjMyOS0uMzQ1LjUxOC0uNzMuNDg0LS45OG0xNS40NzcgMjMuODI4Yy0uMzQ1LTEuMDQyLTEuNDUzLTEuMzc3LTMuMjk2LS45OTctNS40NzEgMS4xMjktNy40My4zNDctOC4wNzMtLjEyNyA0LjI1Mi02LjQ3OCA3Ljc1LTE0LjMwOCA5LjYzNy0yMS42MTQuODk0LTMuNDYxIDEuMzg4LTYuNjc1IDEuNDI4LTkuMjk0LjA0NS0yLjg3Ni0uNDQ1LTQuOTg4LTEuNDU1LTYuMjc5LTQuMDcyLTUuMjAzLTEwLjA0OC03Ljk5NC0xNy4yODMtOC4wNy00Ljk3My0uMDU2LTkuMTc1IDEuMjE3LTkuOTkgMS41NzVhMjUgMjUgMCAwIDAtNS42MjItLjcyMmMtMy43MzQtLjA2LTYuOTYxLjgzNC05LjYzMyAyLjY1NWE0MyA0MyAwIDAgMC03LjgyOC0yLjA1MmMtNi4zNDItMS4wMjEtMTEuMzgxLS4yNDgtMTQuOTc4IDIuMy00LjI5MSAzLjA0LTYuMjcyIDguNDc1LTUuODg4IDE2LjE1Mi4xMjkgMi41ODMgMS42MDEgMTAuNTI5IDMuOTIzIDE4LjEzOSAzLjA1NyAxMC4wMTYgNi4zOCAxNS42ODYgOS44NzcgMTYuODUyYTQuNCA0LjQgMCAwIDAgMS40MDIuMjMyYzEuMjc2IDAgMi44MzktLjU3NSA0LjQ2Ni0yLjUzMWExNjEgMTYxIDAgMCAxIDYuMTU2LTYuOTY2IDkuOSA5LjkgMCAwIDAgNC40MjkgMS4xOTFsLjAxLjEyMWMtLjMxLjM2OC0uNTY0LjY5LS43ODEuOTY1LTEuMDcgMS4zNTgtMS4yOTMgMS42NDEtNC43MzggMi4zNTEtLjk4LjIwMi0zLjU4Mi43MzgtMy42MiAyLjU2My0uMDQxIDEuOTkzIDMuMDc2IDIuODMgMy40MzEgMi45MTkgMS4yMzguMzEgMi40My40NjMgMy41NjguNDYzIDIuNzY2IDAgNS4yLS45MDkgNy4xNDUtMi42NjgtLjA2IDcuMTA2LjIzNiAxNC4xMDcgMS4wODkgMTYuMjQxLjY5OSAxLjc0NiAyLjQwNiA2LjAxNCA3Ljc5OCA2LjAxNC43OTEgMCAxLjY2Mi0uMDkyIDIuNjItLjI5NyA1LjYyNy0xLjIwNyA4LjA3MS0zLjY5NCA5LjAxNi05LjE3Ny41MDYtMi45MyAxLjM3NC05LjkyOCAxLjc4Mi0xMy42ODIuODYyLjI2OSAxLjk3MS4zOTIgMy4xNy4zOTIgMi41MDEgMCA1LjM4Ny0uNTMxIDcuMTk3LTEuMzcyIDIuMDMzLS45NDQgNS43MDItMy4yNjEgNS4wMzctNS4yNzR6TTYxLjggMjMuMTQ3Yy0uMDE5IDEuMTA4LS4xNzEgMi4xMTQtLjMzMyAzLjE2NC0uMTc0IDEuMTI5LS4zNTQgMi4yOTctLjM5OSAzLjcxNS0uMDQ1IDEuMzc5LjEyOCAyLjgxNC4yOTQgNC4yLjMzNyAyLjgwMS42ODIgNS42ODUtLjY1NSA4LjUzMWExMSAxMSAwIDAgMS0uNTkyLTEuMjE4Yy0uMTY2LS40MDMtLjUyNy0xLjA1LTEuMDI3LTEuOTQ2LTEuOTQ0LTMuNDg3LTYuNDk3LTExLjY1Mi00LjE2Ny0xNC45ODQuNjk0LS45OTIgMi40NTYtMi4wMTEgNi44NzktMS40NjN6TTU2LjQzOSA0LjM3NGM2LjQ4Mi4xNDMgMTEuNjA5IDIuNTY4IDE1LjI0IDcuMjA3IDIuNzg0IDMuNTU4LS4yODIgMTkuNzQ5LTkuMTU4IDMzLjcxNmwtLjI2OS0uMzM5LS4xMTItLjE0YzIuMjk0LTMuNzg4IDEuODQ1LTcuNTM2IDEuNDQ2LTEwLjg1OS0uMTY0LTEuMzY0LS4zMTktMi42NTItLjI4LTMuODYxLjA0MS0xLjI4My4yMS0yLjM4Mi4zNzQtMy40NDYuMjAyLTEuMzExLjQwNy0yLjY2Ny4zNS00LjI2NWExLjggMS44IDAgMCAwIC4wMzctLjYwMWMtLjE0NC0xLjUzMy0xLjg5NC02LjEyLTUuNDYyLTEwLjI3My0xLjk1MS0yLjI3MS00Ljc5Ny00LjgxMy04LjY4Mi02LjUyN2EyOS4zIDI5LjMgMCAwIDEgNi41MTUtLjYxMnpNMjAuMTY3IDUzLjI5OGMtMS43OTMgMi4xNTUtMy4wMzEgMS43NDItMy40MzggMS42MDctMi42NTMtLjg4NS01LjczLTYuNDkxLTguNDQ0LTE1LjM4Mi0yLjM0OC03LjY5My0zLjcyLTE1LjQyOC0zLjgyOS0xNy41OTctLjM0My02Ljg2IDEuMzItMTEuNjQxIDQuOTQzLTE0LjIxIDUuODk2LTQuMTgxIDE1LjU4OS0xLjY3OSAxOS40ODQtLjQwOWwtLjE3LjE2M2MtNi4zOTEgNi40NTUtNi4yNCAxNy40ODMtNi4yMjQgMTguMTU3YTIyIDIyIDAgMCAwIC4wNTEgMS4xMzVjLjExIDEuODU1LjMxNSA1LjMwNy0uMjMyIDkuMjE3LS41MDggMy42MzMuNjEyIDcuMTg5IDMuMDcyIDkuNzU2cS4zODMuMzk4Ljc5NS43NWExNjQgMTY0IDAgMCAwLTYuMDA4IDYuODE0em02LjgzLTkuMTEzYy0xLjk4My0yLjA2OS0yLjg4NC00Ljk0Ny0yLjQ3MS03Ljg5Ni41NzctNC4xMy4zNjQtNy43MjcuMjUtOS42NTlsLS4wMzktLjY5NGMuOTM0LS44MjggNS4yNjEtMy4xNDYgOC4zNDYtMi40MzkgMS40MDguMzIzIDIuMjY2IDEuMjgxIDIuNjIzIDIuOTMxIDEuODQ2IDguNTM5LjI0NCAxMi4wOTgtMS4wNDMgMTQuOTU3LS4yNjUuNTg5LS41MTYgMS4xNDYtLjczIDEuNzIybC0uMTY2LjQ0NWMtLjQyIDEuMTI2LS44MTEgMi4xNzMtMS4wNTMgMy4xNjctMi4xMDgtLjAwNi00LjE1OS0uOTA3LTUuNzE4LTIuNTM0em0uMzI0IDExLjUxNmE1IDUgMCAwIDEtMS40OTQtLjY0MmMuMjcxLS4xMjguNzU0LS4zMDEgMS41OTEtLjQ3NCA0LjA1Mi0uODM0IDQuNjc4LTEuNDIzIDYuMDQ1LTMuMTU4LjMxMy0uMzk4LjY2OS0uODQ5IDEuMTYtMS4zOTguNzMzLS44MjEgMS4wNjgtLjY4MiAxLjY3Ni0uNDMuNDkzLjIwNC45NzIuODIxIDEuMTY3IDEuNTAxLjA5Mi4zMjEuMTk1LjkzLS4xNDMgMS40MDQtMi44NTUgMy45OTctNy4wMTUgMy45NDYtMTAuMDAzIDMuMTk4em0yMS4yMDcgMTkuNzM1Yy00Ljk1NyAxLjA2Mi02LjcxMy0xLjQ2Ny03Ljg2OS00LjM1OS0uNzQ3LTEuODY3LTEuMTEzLTEwLjI4NS0uODUzLTE5LjU4MmExLjEgMS4xIDAgMCAwLS4wNDgtLjM1NiA1IDUgMCAwIDAtLjEzOS0uNjU3Yy0uMzg3LTEuMzUzLTEuMzMxLTIuNDg0LTIuNDYyLTIuOTUzLS40NS0uMTg2LTEuMjc1LS41MjgtMi4yNjctLjI3NC4yMTItLjg3MS41NzgtMS44NTUuOTc2LTIuOTIxbC4xNjctLjQ0OGMuMTg4LS41MDUuNDIzLTEuMDI5LjY3My0xLjU4MyAxLjM0Ny0yLjk5MiAzLjE5Mi03LjA5MSAxLjE5LTE2LjM1LS43NS0zLjQ2OC0zLjI1NC01LjE2MS03LjA1LTQuNzY4LTIuMjc2LjIzNS00LjM1OCAxLjE1NC01LjM5NiAxLjY4cS0uMzM0LjE2OS0uNjE4LjMyOWMuMjktMy40OTQgMS4zODUtMTAuMDI0IDUuNDgxLTE0LjE1NiAyLjU3OS0yLjYwMSA2LjAxNC0zLjg4NiAxMC4xOTktMy44MTcgOC4yNDYuMTM1IDEzLjUzNCA0LjM2NyAxNi41MTggNy44OTMgMi41NzEgMy4wMzkgMy45NjQgNi4xIDQuNTIgNy43NTEtNC4xNzktLjQyNS03LjAyMi40LTguNDYzIDIuNDYtMy4xMzUgNC40ODEgMS43MTUgMTMuMTc4IDQuMDQ2IDE3LjM1OC40MjcuNzY2Ljc5NiAxLjQyOC45MTIgMS43MDkuNzU5IDEuODM5IDEuNzQyIDMuMDY3IDIuNDU5IDMuOTY0LjIyLjI3NS40MzMuNTQxLjU5Ni43NzQtMS4yNjYuMzY1LTMuNTM5IDEuMjA4LTMuMzMyIDUuNDIyLS4xNjcgMi4xMTUtMS4zNTYgMTIuMDE2LTEuOTU5IDE1LjUxNC0uNzk3IDQuNjIxLTIuNDk3IDYuMzQzLTcuMjc5IDcuMzY4em0yMC42OTMtMjMuNjhjLTEuMjk0LjYwMS0zLjQ2IDEuMDUyLTUuNTE4IDEuMTQ4LTIuMjczLjEwNy0zLjQzLS4yNTUtMy43MDItLjQ3Ny0uMTI4LTIuNjI2Ljg1LTIuOTAxIDEuODg0LTMuMTkxLjE2My0uMDQ2LjMyMS0uMDkuNDc0LS4xNDRhNCA0IDAgMCAwIC4zMTMuMjNjMS44MjcgMS4yMDYgNS4wODUgMS4zMzYgOS42ODUuMzg2bC4wNS0uMDFjLS42Mi41OC0xLjY4MiAxLjM1OS0zLjE4NyAyLjA1OHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"
        },
        "displayName": "Postgres",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          },
          {
            "id": 5,
            "name": "Development"
          }
        ]
      },
      {
        "id": 38,
        "icon": "fa:pen",
        "name": "n8n-nodes-base.set",
        "codex": {
          "data": {
            "alias": [
              "Set",
              "JS",
              "JSON",
              "Filter",
              "Transform",
              "Map"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/",
                  "icon": "🏭",
                  "label": "Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"
                },
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-pulling-and-visualizing-data-with-n8n/",
                  "icon": "📈",
                  "label": "Automatically pulling and visualizing data with n8n"
                },
                {
                  "url": "https://n8n.io/blog/database-monitoring-and-alerting-with-n8n/",
                  "icon": "📡",
                  "label": "Database Monitoring and Alerting with n8n"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/",
                  "icon": "🔗",
                  "label": "How to build a low-code, self-hosted URL shortener in 3 steps"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/",
                  "icon": " 🕸️",
                  "label": "How uProc scraped a multi-page website with a low-code workflow"
                },
                {
                  "url": "https://n8n.io/blog/building-an-expense-tracking-app-in-10-minutes/",
                  "icon": "📱",
                  "label": "Building an expense tracking app in 10 minutes"
                },
                {
                  "url": "https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/",
                  "icon": "📹",
                  "label": "The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/",
                  "icon": "🤖",
                  "label": "5 workflow automations for Mattermost that we love at n8n"
                },
                {
                  "url": "https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/",
                  "icon": "🧰",
                  "label": "Learn to Build Powerful API Endpoints Using Webhooks"
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/",
                  "icon": "📈",
                  "label": "A low-code bitcoin ticker built with QuestDB and n8n.io"
                },
                {
                  "url": "https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/",
                  "icon": "🎡",
                  "label": "How to set up a no-code CI/CD pipeline with GitHub and TravisCI"
                },
                {
                  "url": "https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/",
                  "icon": "🎖",
                  "label": "Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"
                },
                {
                  "url": "https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/",
                  "icon": "🛵",
                  "label": "How Goomer automated their operations with over 200 n8n workflows"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Edit Fields"
        },
        "iconData": {
          "icon": "pen",
          "type": "icon"
        },
        "displayName": "Edit Fields (Set)",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 40,
        "icon": "file:slack.svg",
        "name": "n8n-nodes-base.slack",
        "codex": {
          "data": {
            "alias": [
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/",
                  "icon": "⚙️",
                  "label": "Automate your data processing pipeline in 9 steps"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/",
                  "icon": "⚡️",
                  "label": "5 tasks you can automate with the new Notion API "
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/",
                  "icon": "👏",
                  "label": "How to automatically give kudos to contributors with GitHub, Slack, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/automations-for-activists/",
                  "icon": "✨",
                  "label": "How Common Knowledge use workflow automation for activism"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/slack/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"output\"]",
        "defaults": {
          "name": "Slack"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"
        },
        "displayName": "Slack",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 112,
        "icon": "fa:map-signs",
        "name": "n8n-nodes-base.switch",
        "codex": {
          "data": {
            "alias": [
              "Router",
              "If",
              "Path",
              "Filter",
              "Condition",
              "Logic",
              "Branch",
              "Case"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/",
                  "icon": "☀️",
                  "label": "2021: The Year to Automate the New You with n8n"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/",
                  "icon": "🏷️",
                  "label": "How to automatically manage contributions to open-source projects"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Switch",
          "color": "#506000"
        },
        "iconData": {
          "icon": "map-signs",
          "type": "icon"
        },
        "displayName": "Switch",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 356,
        "icon": "file:gmail.svg",
        "name": "n8n-nodes-base.gmail",
        "codex": {
          "data": {
            "alias": [
              "email",
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/",
                  "icon": "💪",
                  "label": "Using Automation to Boost Productivity in the Workplace"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Gmail"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"
        },
        "displayName": "Gmail",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 834,
        "icon": "file:code.svg",
        "name": "n8n-nodes-base.code",
        "codex": {
          "data": {
            "alias": [
              "cpde",
              "Javascript",
              "JS",
              "Python",
              "Script",
              "Custom Code",
              "Function"
            ],
            "details": "The Code node allows you to execute JavaScript in your workflow.",
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Code",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 839,
        "icon": "fa:clock",
        "name": "n8n-nodes-base.scheduleTrigger",
        "codex": {
          "data": {
            "alias": [
              "Time",
              "Scheduler",
              "Polling",
              "Cron",
              "Interval"
            ],
            "resources": {
              "generic": [],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"trigger\",\"schedule\"]",
        "defaults": {
          "name": "Schedule Trigger",
          "color": "#31C49F"
        },
        "iconData": {
          "icon": "clock",
          "type": "icon"
        },
        "displayName": "Schedule Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 1119,
        "icon": "fa:robot",
        "name": "@n8n/n8n-nodes-langchain.agent",
        "codex": {
          "data": {
            "alias": [
              "LangChain",
              "Chat",
              "Conversational",
              "Plan and Execute",
              "ReAct",
              "Tools"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Agents",
                "Root Nodes"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "AI Agent",
          "color": "#404040"
        },
        "iconData": {
          "icon": "robot",
          "type": "icon"
        },
        "displayName": "AI Agent",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1281,
        "icon": "file:openrouter.svg",
        "name": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatopenrouter/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Language Models",
                "Root Nodes"
              ],
              "Language Models": [
                "Chat Models (Recommended)"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "OpenRouter Chat Model"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjOTRBM0I4IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHdpZHRoPSI0MCIgaGVpZ2h0PSI0MCIgdmlld0JveD0iMCAwIDI0IDI0IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjx0aXRsZT5PcGVuUm91dGVyPC90aXRsZT48cGF0aCBkPSJNMTYuODA0IDEuOTU3bDcuMjIgNC4xMDV2LjA4N0wxNi43MyAxMC4yMWwuMDE3LTIuMTE3LS44MjEtLjAzYy0xLjA1OS0uMDI4LTEuNjExLjAwMi0yLjI2OC4xMS0xLjA2NC4xNzUtMi4wMzguNTc3LTMuMTQ3IDEuMzUyTDguMzQ1IDExLjAzYy0uMjg0LjE5NS0uNDk1LjMzNi0uNjguNDU1bC0uNTE1LjMyMi0uMzk3LjIzNC4zODUuMjMuNTMuMzM4Yy40NzYuMzE0IDEuMTcuNzk2IDIuNzAxIDEuODY2IDEuMTEuNzc1IDIuMDgzIDEuMTc3IDMuMTQ3IDEuMzUybC4zLjA0NWMuNjk0LjA5MSAxLjM3NS4wOTQgMi44MjUuMDMzbC4wMjItMi4xNTkgNy4yMiA0LjEwNXYuMDg3TDE2LjU4OSAyMmwuMDE0LTEuODYyLS42MzUuMDIyYy0xLjM4Ni4wNDItMi4xMzcuMDAyLTMuMTM4LS4xNjItMS42OTQtLjI4LTMuMjYtLjkyNi00Ljg4MS0yLjA1OWwtMi4xNTgtMS41YTIxLjk5NyAyMS45OTcgMCAwMC0uNzU1LS40OThsLS40NjctLjI4YTU1LjkyNyA1NS45MjcgMCAwMC0uNzYtLjQzQzIuOTA4IDE0LjczLjU2MyAxNC4xMTYgMCAxNC4xMTZWOS44ODhsLjE0LjAwNGMuNTY0LS4wMDcgMi45MS0uNjIyIDMuODA5LTEuMTI0bDEuMDE2LS41OC40MzgtLjI3NGMuNDI4LS4yOCAxLjA3Mi0uNzI2IDIuNjg2LTEuODUzIDEuNjIxLTEuMTMzIDMuMTg2LTEuNzggNC44ODEtMi4wNTkgMS4xNTItLjE5IDEuOTc0LS4yMTMgMy44MTQtLjEzOGwuMDItMS45MDd6Ij48L3BhdGg+PC9zdmc+Cg=="
        },
        "displayName": "OpenRouter Chat Model",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 44,
        "name": "Crypto Trading"
      },
      {
        "id": 49,
        "name": "AI Summarization"
      }
    ],
    "image": []
  }
}