{"workflow":{"id":13999,"name":"Validate JSON and CSV import data via webhook with configurable rules","views":3,"recentViews":0,"totalViews":3,"createdAt":"2026-03-11T10:57:44.619Z","description":"### **How it works**\nSend a POST request with a JSON array of records and your validation rules. The workflow checks every field in every row and returns a structured report showing valid/invalid rows with specific error messages.\n\nSupported rules: required, type (string, number, email, date, url, boolean), min/max, minLength/maxLength, regex, enum, and dateFormat (YYYY-MM-DD, DD.MM.YYYY, MM/DD/YYYY).\n\nThe response includes a summary (total, valid, and invalid row counts) plus a detailed error list with row number, field name, failed rule, and error message.\n\n### Set up steps\n1. Import the workflow and activate it\n2. Send a POST request to the webhook URL with \"data\" (array of objects) and \"rules\" (validation config)\n3. Optionally edit the Set Default Rules node to define fallback rules — these are used when no rules are sent in the request\n\nNo external services or API keys required. Works on self-hosted and cloud n8n instances.\n\n### Who is this for\nOperations teams, data engineers, and anyone importing data into ERP systems, CRMs, or databases who needs to catch errors before bad data enters the system.\n\n### How to customize\nEdit the Set Default Rules node for your standard field definitions. Rules sent in the request body override the defaults, so one endpoint works for multiple data structures. Extend the Code node for custom checks like cross-field validation.\n","workflow":{"id":"63xAsYgwMTW1oqMe","meta":{"instanceId":"a39a10e1017be5c481194e25798c5c17cd990d01d0f9a443239bb35790ba5b46"},"name":"Validate CSV and JSON import data with configurable rules via webhook","tags":[],"nodes":[{"id":"450b896a-7d82-45d9-9a11-4b1e67a8e497","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[0,-128],"parameters":{"color":4,"width":800,"height":588,"content":"## Validate CSV/JSON Import Data with Configurable Rules\n\nThis workflow provides a **reusable data validation API endpoint** for your import pipelines. Send any JSON array of records along with validation rules, and get back a detailed report showing which rows passed and which failed, with specific error messages per field.\n\n### Who is this for?\nOperations teams, data engineers, or anyone importing data into ERP, CRM, databases, or spreadsheets who needs to catch errors **before** they enter the system.\n\n### How it works\n1. Send a POST request with `data` (array of records) and `rules` (validation config)\n2. The workflow validates every field in every row against your rules\n3. Returns a structured JSON report: total/valid/invalid rows + detailed errors\n\n### Supported validation rules\n`required`, `type` (string, number, email, date, url, boolean), `min`, `max`, `minLength`, `maxLength`, `regex`, `enum`, `dateFormat`\n\n### Setup\n1. Activate the workflow\n2. Send a POST request to the webhook URL\n3. Optionally configure default rules in the **Set Default Rules** node\n\n**Author:** Florian Eiche, [eiche-digital.de](https://eiche-digital.de)"},"typeVersion":1},{"id":"0143af87-c46e-4707-8318-fed250e86739","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[0,480],"parameters":{"width":280,"height":328,"content":"### Step 1: Receive Data\nPOST request with JSON body:\n```json\n{\n  \"data\": [{...}, {...}],\n  \"rules\": {\n    \"fieldName\": {\n      \"required\": true,\n      \"type\": \"email\"\n    }\n  }\n}\n```\nRules in the request override the defaults."},"typeVersion":1},{"id":"6b3086af-a198-426b-bafc-421d8ac13068","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[320,480],"parameters":{"width":280,"height":328,"content":"### Step 2: Default Rules\nConfigure fallback validation rules here. These are used when the request body does not include a `rules` object.\n\nEdit the JSON in the **Set Default Rules** node to match your data structure."},"typeVersion":1},{"id":"ba474ce4-e4da-47e4-a912-5a320dc60eb5","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[640,480],"parameters":{"width":300,"height":328,"content":"### Step 3: Validate\nThe Code node checks every row against the rules and collects all errors.\n\nSupported checks:\n- `required`\n- `type`: string, number, email, date, url, boolean\n- `min` / `max` (numbers)\n- `minLength` / `maxLength`\n- `regex` (custom pattern)\n- `enum` (allowed values)\n- `dateFormat` (YYYY-MM-DD, DD.MM.YYYY, MM/DD/YYYY)"},"typeVersion":1},{"id":"761e962f-7e78-4418-8bcf-814c0e67c8cc","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[992,416],"parameters":{"width":296,"height":392,"content":"### Step 4: Response\nReturns a JSON report:\n```json\n{\n  \"valid\": false,\n  \"summary\": {\n    \"totalRows\": 3,\n    \"validRows\": 1,\n    \"invalidRows\": 2,\n    \"totalErrors\": 4\n  },\n  \"errors\": [\n    {\n      \"row\": 2,\n      \"field\": \"email\",\n      \"value\": \"invalid\",\n      \"rule\": \"type:email\",\n      \"message\": \"...\"\n    }\n  ]\n}\n```"},"typeVersion":1},{"id":"9cba0c0c-f991-4113-b267-3577c6a77698","name":"Receive Data","type":"n8n-nodes-base.webhook","position":[112,848],"webhookId":"4344cc96-7296-40c8-ae0a-0383ee05dfe5","parameters":{"path":"validate-data","options":{},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":2.1},{"id":"29a55404-f6ac-47e3-870c-e9d4edde4b9a","name":"Set Default Rules","type":"n8n-nodes-base.set","position":[432,848],"parameters":{"mode":"raw","options":{},"jsonOutput":"{\n  \"rules\": {\n    \"name\": {\n      \"required\": true,\n      \"type\": \"string\",\n      \"minLength\": 2,\n      \"maxLength\": 100\n    },\n    \"email\": {\n      \"required\": true,\n      \"type\": \"email\"\n    },\n    \"age\": {\n      \"required\": false,\n      \"type\": \"number\",\n      \"min\": 0,\n      \"max\": 150\n    },\n    \"status\": {\n      \"required\": true,\n      \"type\": \"string\",\n      \"enum\": [\"active\", \"inactive\", \"pending\"]\n    },\n    \"website\": {\n      \"required\": false,\n      \"type\": \"url\"\n    },\n    \"joinDate\": {\n      \"required\": false,\n      \"type\": \"date\",\n      \"dateFormat\": \"YYYY-MM-DD\"\n    }\n  }\n}"},"typeVersion":3.4},{"id":"38d23008-b445-4885-be49-c76b0478e877","name":"Validate Data","type":"n8n-nodes-base.code","position":[752,848],"parameters":{"jsCode":"// Get input data and rules\nconst input = $('Receive Data').first().json.body;\nconst defaults = $('Set Default Rules').first().json;\n\nconst data = input.data;\nconst rules = input.rules || defaults.rules || {};\n\n// Validate input\nif (!data || !Array.isArray(data)) {\n  return [{\n    json: {\n      valid: false,\n      error: 'Invalid input: \"data\" must be an array of objects.',\n      summary: { totalRows: 0, validRows: 0, invalidRows: 0, totalErrors: 1 },\n      errors: []\n    }\n  }];\n}\n\nif (!rules || Object.keys(rules).length === 0) {\n  return [{\n    json: {\n      valid: false,\n      error: 'No validation rules provided. Send rules in the request body or configure them in the Set Default Rules node.',\n      summary: { totalRows: data.length, validRows: 0, invalidRows: 0, totalErrors: 1 },\n      errors: []\n    }\n  }];\n}\n\n// Validation helpers\nconst isPresent = (v) => v !== null && v !== undefined && v !== '';\nconst isEmail = (v) => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(String(v));\nconst isNumber = (v) => !isNaN(Number(v)) && String(v).trim() !== '';\nconst isUrl = (v) => /^https?:\\/\\/.+\\..+/.test(String(v));\nconst isBool = (v) => ['true','false','0','1','yes','no'].includes(String(v).toLowerCase());\n\nfunction isValidDate(v, fmt) {\n  if (fmt === 'YYYY-MM-DD') return /^\\d{4}-\\d{2}-\\d{2}$/.test(v);\n  if (fmt === 'DD.MM.YYYY') return /^\\d{2}\\.\\d{2}\\.\\d{4}$/.test(v);\n  if (fmt === 'MM/DD/YYYY') return /^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(v);\n  return !isNaN(Date.parse(v));\n}\n\nconst errors = [];\nlet validRows = 0;\nlet invalidRows = 0;\n\nfor (let i = 0; i < data.length; i++) {\n  const row = data[i];\n  let rowHasError = false;\n\n  for (const [field, fr] of Object.entries(rules)) {\n    const value = row[field];\n\n    // Required check\n    if (fr.required && !isPresent(value)) {\n      errors.push({\n        row: i + 1, field, value: value ?? null,\n        rule: 'required',\n        message: `Field '${field}' is required`\n      });\n      rowHasError = true;\n      continue;\n    }\n\n    // Skip further checks if empty and not required\n    if (!isPresent(value)) continue;\n\n    // Type checks\n    if (fr.type) {\n      let typeValid = true;\n      let typeLabel = fr.type;\n\n      switch (fr.type) {\n        case 'string':\n          typeValid = typeof value === 'string';\n          break;\n        case 'number':\n          typeValid = isNumber(value);\n          break;\n        case 'email':\n          typeValid = isEmail(value);\n          break;\n        case 'url':\n          typeValid = isUrl(value);\n          break;\n        case 'boolean':\n          typeValid = isBool(value);\n          break;\n        case 'date':\n          typeValid = isValidDate(value, fr.dateFormat);\n          typeLabel = fr.dateFormat ? `date (${fr.dateFormat})` : 'date';\n          break;\n      }\n\n      if (!typeValid) {\n        errors.push({\n          row: i + 1, field, value,\n          rule: `type:${fr.type}`,\n          message: `Field '${field}' must be a valid ${typeLabel}`\n        });\n        rowHasError = true;\n      }\n    }\n\n    // String length checks\n    if (fr.minLength !== undefined && String(value).length < fr.minLength) {\n      errors.push({\n        row: i + 1, field, value,\n        rule: 'minLength',\n        message: `Field '${field}' must be at least ${fr.minLength} characters`\n      });\n      rowHasError = true;\n    }\n\n    if (fr.maxLength !== undefined && String(value).length > fr.maxLength) {\n      errors.push({\n        row: i + 1, field, value,\n        rule: 'maxLength',\n        message: `Field '${field}' must be at most ${fr.maxLength} characters`\n      });\n      rowHasError = true;\n    }\n\n    // Numeric range checks\n    if (fr.min !== undefined && isNumber(value) && Number(value) < fr.min) {\n      errors.push({\n        row: i + 1, field, value,\n        rule: 'min',\n        message: `Field '${field}' must be >= ${fr.min}`\n      });\n      rowHasError = true;\n    }\n\n    if (fr.max !== undefined && isNumber(value) && Number(value) > fr.max) {\n      errors.push({\n        row: i + 1, field, value,\n        rule: 'max',\n        message: `Field '${field}' must be <= ${fr.max}`\n      });\n      rowHasError = true;\n    }\n\n    // Regex check\n    if (fr.regex && !new RegExp(fr.regex).test(String(value))) {\n      errors.push({\n        row: i + 1, field, value,\n        rule: 'regex',\n        message: `Field '${field}' does not match pattern: ${fr.regex}`\n      });\n      rowHasError = true;\n    }\n\n    // Enum check\n    if (fr.enum && !fr.enum.includes(value)) {\n      errors.push({\n        row: i + 1, field, value,\n        rule: 'enum',\n        message: `Field '${field}' must be one of: ${fr.enum.join(', ')}`\n      });\n      rowHasError = true;\n    }\n  }\n\n  if (rowHasError) invalidRows++;\n  else validRows++;\n}\n\nreturn [{\n  json: {\n    valid: errors.length === 0,\n    summary: {\n      totalRows: data.length,\n      validRows,\n      invalidRows,\n      totalErrors: errors.length\n    },\n    errors\n  }\n}];"},"typeVersion":2},{"id":"3506f389-3a17-43ad-aa6f-7a2b0774943e","name":"Respond with Report","type":"n8n-nodes-base.respondToWebhook","position":[1072,848],"parameters":{"options":{"responseHeaders":{"entries":[{"name":"Content-Type","value":"application/json"}]}},"respondWith":"json","responseBody":"={{ $json }}"},"typeVersion":1.5}],"active":true,"pinData":{},"settings":{"binaryMode":"separate","availableInMCP":false,"executionOrder":"v1"},"versionId":"312a0c2e-7262-4648-b1c4-f42cba4fd2a1","connections":{"Receive Data":{"main":[[{"node":"Set Default Rules","type":"main","index":0}]]},"Validate Data":{"main":[[{"node":"Respond with Report","type":"main","index":0}]]},"Set Default Rules":{"main":[[{"node":"Validate Data","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":9,"nodeTypes":{"n8n-nodes-base.set":{"count":1},"n8n-nodes-base.code":{"count":1},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"n8n-nodes-base.respondToWebhook":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Florian Eiche","username":"jagged","bio":"Freelance ERP- und Prozessberater mit 13+ Jahren Erfahrung in Logistik und Pharma. Ich automatisiere Workflows mit n8n, baue Schnittstellen zwischen ERP, CRM und Webshop-Systemen und entwickle individuelle Lösungen für KMU in der DACH-Region. Schwerpunkte: Systemintegration, Workflow-Automatisierung, regulierte Branchen (GxP/Pharma). Zertifizierter Scrum Master (PSM I) und ITIL Foundation.","verified":true,"links":["https://eiche-digital.de/"],"avatar":"https://gravatar.com/avatar/535068ebdbc9fc59003b16ba0ea35ac4b279374067b4ea1732af2a24b6a449de?r=pg&d=retro&size=200"},"nodes":[{"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":47,"icon":"file:webhook.svg","name":"n8n-nodes-base.webhook","codex":{"data":{"alias":["HTTP","API","Build","WH"],"resources":{"generic":[{"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/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"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/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/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"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/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/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/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"},{"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/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-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"trigger\"]","defaults":{"name":"Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Webhook","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":535,"icon":"file:webhook.svg","name":"n8n-nodes-base.respondToWebhook","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/"}]},"categories":["Core Nodes","Utility"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"transform\"]","defaults":{"name":"Respond to Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Respond to Webhook","typeVersion":2,"nodeCategories":[{"id":7,"name":"Utility"},{"id":9,"name":"Core Nodes"}]},{"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"}]}],"categories":[{"id":35,"name":"Document Extraction"}],"image":[]}}