# N8N - Llms-Txt **Pages:** 1301 --- ## HTTP Request node common issues **URL:** llms-txt#http-request-node-common-issues **Contents:** - Bad request - please check your parameters - The resource you are requesting could not be found - JSON parameter need to be an valid JSON - Forbidden - perhaps check your credentials - 429 - The service is receiving too many requests from you - Batching - Retry on Fail Here are some common errors and issues with the [HTTP Request node](../) and steps to resolve or troubleshoot them. ## Bad request - please check your parameters This error displays when the node receives a 400 error indicating a bad request. This error most often occurs because: - You're using an invalid name or value in a **Query Parameter**. - You're passing array values in a **Query Parameter** but the array isn't formatted correctly. Try using the [**Array Format in Query Parameters**](../#array-format-in-query-parameters) option. Review the API documentation for your service to format your query parameters. ## The resource you are requesting could not be found This error displays when the endpoint **URL** you entered is invalid. This may be due to a typo in the URL or a deprecated API. Refer to your service's API documentation to verify you have a valid endpoint. ## JSON parameter need to be an valid JSON This error displays when you've passed a parameter as JSON and it's not formatted as valid JSON. To resolve, review the JSON you've entered for these issues: - Test your JSON in a JSON checker or syntax parser to find errors like missing quotation marks, extra or missing commas, incorrectly formatted arrays, extra or missing square brackets or curly brackets, and so on. - If you've used an **Expression** in the node, be sure you've wrapped the entire JSON in double curly brackets, for example: ## Forbidden - perhaps check your credentials This error displays when the node receives a 403 error indicating authentication failed. To resolve, review the selected credentials and make sure you can authenticate with them. You may need to: - Update permissions or scopes so that your API key or account can perform the operation you've selected. - Format your generic credential in a different way. - Generate a new API key or token with the appropriate permissions or scopes. ## 429 - The service is receiving too many requests from you This error displays when the node receives a [429 error](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/429) from the service that you're calling. This often means that you have hit the rate limits of that service. You can find out more on the [Handling API rate limits](../../../rate-limits/) page. To resolve the error, you can use one of the built-in options of the HTTP request node: Use this option to send requests in batches and introduce a delay between them. 1. In the HTTP Request node, select **Add Option > Batching**. 1. Set **Items per Batch** to the number of input items to include in each request. 1. Set **Batch Interval (ms)** to introduce a delay between requests in milliseconds. For example, to send one request to an API per second, set **Batch Interval (ms)** to `1000`. Use this option to retry the node after a failed attempt. 1. In the HTTP Request node, go to **Settings** and enable **Retry on Fail**. 1. Set **Max Tries** to the maximum number of times n8n should retry the node. 1. Set **Wait Between Tries (ms)** to the desired delay in milliseconds between retries. For example, to wait one second before retrying the request again, set **Wait Between Tries (ms)** to `1000`. **Examples:** Example 1 (unknown): ```unknown {{ { "myjson": { "name1": "value1", "name2": "value2", "array1": ["value1","value2"] } } }} ``` --- ## JWT credentials **URL:** llms-txt#jwt-credentials **Contents:** - Supported authentication methods - Related resources - Using Passphrase - Using private key (PEM key) - Available algorithms You can use these credentials to authenticate the following nodes: - [JWT](../../core-nodes/n8n-nodes-base.jwt/) - [Webhook](../../core-nodes/n8n-nodes-base.webhook/) ## Supported authentication methods - Passphrase: Signed with a secret with HMAC algorithm - Private key (PEM key): For use with [Private Key JWT](https://auth0.com/docs/get-started/authentication-and-authorization-flow/authenticate-with-private-key-jwt) with RSA or ECDSA algorithm Refer to the [JSON Web Token spec](https://datatracker.ietf.org/doc/html/rfc7519) for more details. For a more verbose introduction, refer to the [JWT website Introduction to JSON Web Tokens](https://jwt.io/introduction). Refer to [JSON Web Token (JWT) Signing Algorithms Overview](https://auth0.com/blog/json-web-token-signing-algorithms-overview/) for more information on selecting between the two types and the algorithms involved. To configure this credential: 1. Select the **Key Type** of **Passphrase**. 1. Enter the Passphrase **Secret** 1. Select the **Algorithm** used to sign the assertion. Refer to [Available algorithms](#available-algorithms) below for a list of supported algorithms. ## Using private key (PEM key) To configure this credential: 1. Select the **Key Type** of **PEM Key**. 1. A **Private Key**: Obtained from generating a Key Pair. Refer to [Generate RSA Key Pair](https://auth0.com/docs/secure/application-credentials/generate-rsa-key-pair) for an example. 1. A **Public Key**: Obtained from generating a Key Pair. Refer to [Generate RSA Key Pair](https://auth0.com/docs/secure/application-credentials/generate-rsa-key-pair) for an example. 1. Select the **Algorithm** used to sign the assertion. Refer to [Available algorithms](#available-algorithms) below for a list of supported algorithms. ## Available algorithms This n8n credential supports the following algorithms: - `HS256` - `HS384` - `HS512` - `RS256` - `RS384` - `RS512` - `ES256` - `ES384` - `ES512` - `PS256` - `PS384` - `PS512` - `none` --- ## White labelling **URL:** llms-txt#white-labelling **Contents:** - Prerequisites - Theme colors - Theme logos - Text localization - Window title Embed requires an embed license. For more information about when to use Embed, as well as costs and licensing processes, refer to [Embed](https://n8n.io/embed/) on the n8n website. White labelling n8n means customizing the frontend styling and assets to match your brand identity. The process involves changing two packages in n8n's source code [github.com/n8n-io/n8n](https://github.com/n8n-io/n8n): - [packages/frontend/@n8n/design-system](https://github.com/n8n-io/n8n/tree/master/packages/frontend/@n8n/design-system): n8n's [storybook](https://storybook.js.org/) design system with CSS styles and Vue.js components - [packages/frontend/editor-ui](https://github.com/n8n-io/n8n/tree/master/packages/frontend/editor-ui): n8n's [Vue.js](https://vuejs.org/) frontend build with [Vite.js](https://vitejs.dev) You need the following installed on your development machine: - [git](https://git-scm.com/downloads) - Node.js and npm. Minimum version Node 18.17.0. You can find instructions on how to install both using nvm (Node Version Manager) for Linux, Mac, and WSL [here](https://github.com/nvm-sh/nvm). For Windows users, refer to Microsoft's guide to [Install NodeJS on Windows](https://docs.microsoft.com/en-us/windows/dev-environment/javascript/nodejs-on-windows). Create a fork of [n8n's repository](https://github.com/n8n-io/n8n) and clone your new repository. Install all dependencies, build and start n8n. Whenever you make changes you need to rebuild and restart n8n. While developing you can use `npm run dev` to automatically rebuild and restart n8n anytime you make code changes. To customize theme colors open [packages/frontend/@n8n/design-system](https://github.com/n8n-io/n8n/tree/master/packages/frontend/@n8n/design-system) and start with: - [packages/frontend/@n8n/design-system/src/css/\_tokens.scss](https://github.com/n8n-io/n8n/blob/master/packages/frontend/@n8n/design-system/src/css/_tokens.scss) - [packages/frontend/@n8n/design-system/src/css/\_tokens.dark.scss](https://github.com/n8n-io/n8n/blob/master/packages/frontend/@n8n/design-system/src/css/_tokens.dark.scss) At the top of `_tokens.scss` you will find `--color-primary` variables as HSL colors: In the following example the primary color changes to #0099ff. To convert to HSL you can use a [color converter tool](https://www.w3schools.com/colors/colors_converter.asp). To change the editor’s logo assets look into [packages/frontend/editor-ui/public](https://github.com/n8n-io/n8n/tree/master/packages/frontend/editor-ui/public) and replace: - favicon-16x16.png - favicon-32x32.png - favicon.ico - n8n-logo.svg - n8n-logo-collapsed.svg - n8n-logo-expanded.svg Replace these logo assets. n8n uses them in Vue.js components, including: - [MainSidebar.vue](https://github.com/n8n-io/n8n/blob/master/packages/frontend/editor-ui/src/components/MainSidebar.vue): top/left logo in the main sidebar. - [Logo.vue](https://github.com/n8n-io/n8n/blob/master/packages/frontend/editor-ui/src/components/Logo/Logo.vue): reused in other components. In the following example replace `n8n-logo-collapsed.svg` and `n8n-logo-expanded.svg` to update the main sidebar's logo assets. If your logo assets require different sizing or placement you can customize SCSS styles at the bottom of [MainSidebar.vue](https://github.com/n8n-io/n8n/blob/master/packages/frontend/editor-ui/src/components/MainSidebar.vue). To change all text occurrences like `n8n` or `n8n.io` to your brand identity you can customize n8n's English internationalization file: [packages/frontend/@n8n/i18n/src/locales/en.json](https://github.com/n8n-io/n8n/blob/master/packages/frontend/@n8n/i18n/src/locales/en.json). n8n uses the [Vue I18n](https://kazupon.github.io/vue-i18n/) internationalization plugin for Vue.js to translate the majority of UI texts. To search and replace text occurrences inside `en.json` you can use [Linked locale messages](https://kazupon.github.io/vue-i18n/guide/messages.html#linked-locale-messages). In the following example add the `_brand.name` translation key to white label n8n's [AboutModal.vue](https://github.com/n8n-io/n8n/blob/master/packages/frontend/editor-ui/src/components/AboutModal.vue). To change n8n's window title to your brand name, edit the following: - [packages/frontend/editor-ui/index.html](https://github.com/n8n-io/n8n/blob/master/packages/frontend/editor-ui/index.html) - [packages/frontend/editor-ui/src/composables/useDocumentTitle.ts](https://github.com/n8n-io/n8n/blob/master/packages/frontend/editor-ui/src/composables/useDocumentTitle.ts) The following example replaces all occurrences of `n8n` and `n8n.io` with `My Brand` in `index.html` and `useDocumentTitle.ts`. **Examples:** Example 1 (unknown): ```unknown git clone https://github.com//n8n.git n8n cd n8n ``` Example 2 (unknown): ```unknown npm install npm run build npm run start ``` Example 3 (unknown): ```unknown @mixin theme { --color-primary-h: 6.9; --color-primary-s: 100%; --color-primary-l: 67.6%; ``` Example 4 (unknown): ```unknown @mixin theme { --color-primary-h: 204; --color-primary-s: 100%; --color-primary-l: 50%; ``` --- ## Vercel AI Gateway Chat Model node **URL:** llms-txt#vercel-ai-gateway-chat-model-node **Contents:** - Node parameters - Model - Node options - Frequency Penalty - Maximum Number of Tokens - Response Format - Presence Penalty - Sampling Temperature - Timeout - Max Retries Use the Vercel AI Gateway Chat Model node to use AI Gateway chat models with conversational agents. On this page, you'll find the node parameters for the Vercel AI Gateway Chat Model node and links to more resources. You can find authentication information for this node [here](../../../credentials/vercel/). Parameter resolution in sub-nodes Sub-nodes behave differently to other nodes when processing multiple items using an expression. Most nodes, including root nodes, take any number of items as input, process these items, and output the results. You can use expressions to refer to input items, and the node resolves the expression for each item in turn. For example, given an input of five `name` values, the expression `{{ $json.name }}` resolves to each name in turn. In sub-nodes, the expression always resolves to the first item. For example, given an input of five `name` values, the expression `{{ $json.name }}` always resolves to the first name. Select the model to use to generate the completion. n8n dynamically loads models from the AI Gateway and you'll only see the models available to your account. Use these options to further refine the node's behavior. ### Frequency Penalty Use this option to control the chance of the model repeating itself. Higher values reduce the chance of the model repeating itself. ### Maximum Number of Tokens Enter the maximum number of tokens used, which sets the completion length. Choose **Text** or **JSON**. **JSON** ensures the model returns valid JSON. Use this option to control the chance of the model talking about new topics. Higher values increase the chance of the model talking about new topics. ### Sampling Temperature Use this option to control the randomness of the sampling process. A higher temperature creates more diverse sampling, but increases the risk of hallucinations. Enter the maximum request time in milliseconds. Enter the maximum number of times to retry a request. Use this option to set the probability the completion should use. Use a lower value to ignore less probable options. ## Templates and examples [Browse Vercel AI Gateway Chat Model integration templates](https://n8n.io/integrations/vercel-ai-gateway-chat-model/), or [search all templates](https://n8n.io/workflows/) As the Vercel AI Gateway is API-compatible with OpenAI, you can refer to [LangChains's OpenAI documentation](https://js.langchain.com/docs/integrations/chat/openai/) for more information about the service. View n8n's [Advanced AI](../../../../../advanced-ai/) documentation. --- ## Scaling n8n **URL:** llms-txt#scaling-n8n When running n8n at scale, with a large number of users, workflows, or executions, you need to change your n8n configuration to ensure good performance. n8n can run in different [modes](../queue-mode/) depending on your needs. The `queue` mode provides the best scalability. Refer to [Queue mode](../queue-mode/) for configuration details. You can configure data saving and pruning to improve database performance. Refer to [Execution data](../execution-data/) for details. --- ## Code node **URL:** llms-txt#code-node **Contents:** - Usage - Choose a mode - JavaScript - Supported JavaScript features - External libraries - Built-in methods and variables - Keyboard shortcuts - Python (Pyodide - legacy) - Built-in methods and variables - Keyboard shortcuts Use the Code node to write custom JavaScript or Python and run it as a step in your workflow. This page gives usage information about the Code node. For more guidance on coding in n8n, refer to the [Code](../../../../code/) section. It includes: - Reference documentation on [Built-in methods and variables](../../../../code/builtin/overview/) - Guidance on [Handling dates](../../../../code/cookbook/luxon/) and [Querying JSON](../../../../code/cookbook/jmespath/) - A growing collection of examples in the [Cookbook](../../../../code/cookbook/code-node/) Examples and templates For usage examples and templates to help you get started, refer to n8n's [Code integrations](https://n8n.io/integrations/code/) page. Function and Function Item nodes The Code node replaces the Function and Function Item nodes from version 0.198.0. If you're using an older version of n8n, you can still view the [Function node documentation](https://github.com/n8n-io/n8n-docs/blob/67935ad2528e2e30d7984ea917e4af2910a096ec/docs/integrations/builtin/core-nodes/n8n-nodes-base.function.md) and [Function Item node documentation](https://github.com/n8n-io/n8n-docs/blob/67935ad2528e2e30d7984ea917e4af2910a096ec/docs/integrations/builtin/core-nodes/n8n-nodes-base.functionItem.md). How to use the Code node. - **Run Once for All Items**: this is the default. When your workflow runs, the code in the code node executes once, regardless of how many input items there are. - **Run Once for Each Item**: choose this if you want your code to run for every input item. The Code node supports Node.js. ### Supported JavaScript features The Code node supports: - Promises. Instead of returning the items directly, you can return a promise which resolves accordingly. - Writing to your browser console using `console.log`. This is useful for debugging and troubleshooting your workflows. ### External libraries If you self-host n8n, you can import and use built-in and external npm modules in the Code node. To learn how to enable external modules, refer to the [Enable modules in Code node](../../../../hosting/configuration/configuration-examples/modules-in-code-node/) guide. If you use n8n Cloud, you can't import external npm modules. n8n makes two modules available for you: - [crypto Node.js module](https://nodejs.org/docs/latest-v18.x/api/crypto.html) - [moment npm package](https://www.npmjs.com/package/moment) ### Built-in methods and variables n8n provides built-in methods and variables for working with data and accessing n8n data. Refer to [Built-in methods and variables](../../../../code/builtin/overview/) for more information. The syntax to use the built-in methods and variables is `$variableName` or `$methodName()`. Type `$` in the Code node or expressions editor to see a list of suggested methods and variables. ### Keyboard shortcuts The Code node editing environment supports time-saving and useful keyboard shortcuts for a range of operations from autocompletion to code-folding and using multiple-cursors. See the full list of [keyboard shortcuts](keyboard-shortcuts/). ## Python (Pyodide - legacy) Pyodide is a legacy feature. Future versions of n8n will no longer support this feature. n8n added Python support in version 1.0. It doesn't include a Python executable. Instead, n8n provides Python support using [Pyodide](https://pyodide.org/en/stable/), which is a port of CPython to WebAssembly. This limits the available Python packages to the [Packages included with Pyodide](https://pyodide.org/en/stable/usage/packages-in-pyodide.html#packages-in-pyodide). n8n downloads the package automatically the first time you use it. Slower than JavaScript The Code node takes longer to process Python than JavaScript. This is due to the extra compilation steps. ### Built-in methods and variables n8n provides built-in methods and variables for working with data and accessing n8n data. Refer to [Built-in methods and variables](../../../../code/builtin/overview/) for more information. The syntax to use the built-in methods and variables is `_variableName` or `_methodName()`. Type `_` in the Code node to see a list of suggested methods and variables. ### Keyboard shortcuts The Code node editing environment supports time-saving and useful keyboard shortcuts for a range of operations from autocompletion to code-folding and using multiple-cursors. See the full list of [keyboard shortcuts](keyboard-shortcuts/). ## File system and HTTP requests You can't access the file system or make HTTP requests. Use the following nodes instead: - [Read/Write File From Disk](../n8n-nodes-base.readwritefile/) - [HTTP Request](../n8n-nodes-base.httprequest/) ## Python (Native - beta) n8n added native Python support using task runners (beta) in version 1.111.0. Main differences from Pyodide: - Native Python supports only `_items` in all-items mode and `_item` in per-item mode. It doesn't support other n8n built-in methods and variables. - Native Python supports importing native Python modules from the standard library and from third-parties, if the `n8nio/runners` image includes them and explicitly allowlists them. See [adding extra dependencies for task runners](../../../../hosting/configuration/task-runners/#adding-extra-dependencies) for more details. - Native Python denies insecure built-ins by default. See [task runners environment variables](../../../../hosting/configuration/environment-variables/task-runners/) for more details. - Unlike Pyodide, which accepts dot access notation, for example, `item.json.myNewField`, native Python only accepts bracket access notation, for example, `item["json"]["my_new_field"]`. There may be other minor syntax differences where Pyodide accepts constructs that aren't legal in native Python. Keep in mind upgrading to native Python is a breaking change, so you may need to adjust your Python scripts to use the native Python runner. This feature is in beta and is subject to change. As it becomes stable, n8n will roll it out progressively to n8n cloud users during 2025. Self-hosting users can [try it out](../../../../hosting/configuration/task-runners/) and provide feedback. There are two places where you can use code in n8n: the Code node and the expressions editor. When using either area, there are some key concepts you need to know, as well as some built-in methods and variables to help with common tasks. When working with the Code node, you need to understand the following concepts: - [Data structure](../../../../data/data-structure/): understand the data you receive in the Code node, and requirements for outputting data from the node. - [Item linking](../../../../data/data-mapping/data-item-linking/): learn how data items work, and how to link to items from previous nodes. You need to handle item linking in your code when the number of input and output items doesn't match. ### Built-in methods and variables n8n includes built-in methods and variables. These provide support for: - Accessing specific item data - Accessing data about workflows, executions, and your n8n environment - Convenience variables to help with data and time Refer to [Built-in methods and variables](../../../../code/builtin/overview/) for more information. ## Use AI in the Code node AI assistance in the Code node is available to Cloud users. It isn't available in self-hosted n8n. AI generated code overwrites your code If you've already written some code on the **Code** tab, the AI generated code will replace it. n8n recommends using AI as a starting point to create your initial code, then editing it as needed. To use ChatGPT to generate code in the Code node: 1. In the Code node, set **Language** to **JavaScript**. 1. Select the **Ask AI** tab. 1. Write your query. 1. Select **Generate Code**. n8n sends your query to ChatGPT, then displays the result in the **Code** tab. For common questions or issues and suggested solutions, refer to [Common Issues](common-issues/). --- ## monday.com node **URL:** llms-txt#monday.com-node **Contents:** - Operations - Templates and examples - What to do if your operation isn't supported Use the monday.com node to automate work in monday.com, and integrate monday.com with other applications. n8n has built-in support for a wide range of monday.com features, including creating a new board, and adding, deleting, and getting items on the board. On this page, you'll find a list of operations the monday.com node supports and links to more resources. Minimum required version This node requires n8n version 1.22.6 or above. Refer to [monday.com credentials](../../credentials/mondaycom/) for guidance on setting up authentication. This node can be used as an AI tool This node can be used to enhance the capabilities of an AI agent. When used in this way, many parameters can be set automatically, or with information directed by AI - find out more in the [AI tool parameters documentation](../../../../advanced-ai/examples/using-the-fromai-function/). - Board - Archive a board - Create a new board - Get a board - Get all boards - Board Column - Create a new column - Get all columns - Board Group - Delete a group in a board - Create a group in a board - Get list of groups in a board - Board Item - Add an update to an item. - Change a column value for a board item - Change multiple column values for a board item - Create an item in a board's group - Delete an item - Get an item - Get all items - Get items by column value - Move item to group ## Templates and examples **Create ticket on specific customer messages in Telegram** [View template details](https://n8n.io/workflows/368-create-ticket-on-specific-customer-messages-in-telegram/) **Microsoft Outlook AI Email Assistant with contact support from Monday and Airtable** by Cognitive Creators [View template details](https://n8n.io/workflows/2809-microsoft-outlook-ai-email-assistant-with-contact-support-from-monday-and-airtable/) **Retrieve a Monday.com row and all data in a single node** [View template details](https://n8n.io/workflows/2086-retrieve-a-mondaycom-row-and-all-data-in-a-single-node/) [Browse monday.com integration templates](https://n8n.io/integrations/mondaycom/), or [search all templates](https://n8n.io/workflows/) ## What to do if your operation isn't supported If this node doesn't support the operation you want to do, you can use the [HTTP Request node](../../core-nodes/n8n-nodes-base.httprequest/) to call the service's API. You can use the credential you created for this service in the HTTP Request node: 1. In the HTTP Request node, select **Authentication** > **Predefined Credential Type**. 1. Select the service you want to connect to. 1. Select your credential. Refer to [Custom API operations](../../../custom-operations/) for more information. --- ## RBAC role types **URL:** llms-txt#rbac-role-types **Contents:** - Project Admin - Project Editor - Project Viewer - The Project Editor role is available on Pro Cloud and Self-hosted Enterprise plans. - The Project Viewer role is only available on Self-hosted Enterprise and Cloud Enterprise plans. Within projects, there are three user roles: Admin, Editor, and Viewer. These roles control what the user can do in a project. A user can have different roles within different projects. A Project Admin role has the highest level of permissions. Project admins can: - Manage project settings: Change name, delete project. - Manage project members: Invite members and remove members, change members' roles. - View, create, update, and delete any workflows, credentials, or executions within a project. A Project Editor can view, create, update, and delete any workflows, credentials, or executions within a project. A Project Viewer is effectively a `read-only` role with access to all workflows, credentials, and executions within a project. Viewers aren't able to manually execute any workflows that exist in a project. Role types and account types Role types and [account types](../../account-types/) are different things. Every account has one type. The account can have different role types for different [projects](../projects/). | Permission | Admin | Editor | Viewer | | ------------------------------- | ----- | ------ | ------ | | View workflows in the project | | | | | View credentials in the project | | | | | View executions | | | | | Edit credentials and workflows | | | | | Add workflows and credentials | | | | | Execute workflows | | | | | Manage members | | | | | Modify the project | | | | [Variables](../../../code/variables/) and [tags](../../../workflows/tags/) aren't affected by RBAC: they're global across the n8n instance. --- ## Export and import workflows **URL:** llms-txt#export-and-import-workflows **Contents:** - Copy-Paste - From the Editor UI menu - From the command line n8n saves workflows in JSON format. You can export your workflows as JSON files or import JSON files into your n8n library. You can export and import workflows in several ways. Exported workflow JSON files include [credential](../../glossary/#credential-n8n) names and IDs. While IDs aren't sensitive, the names could be, depending on how you name your credentials. HTTP Request nodes may contain authentication headers when imported from cURL. Remove or anonymize this information from the JSON file before sharing to protect your credentials. You can copy and paste a workflow or parts of it by selecting the nodes you want to copy to the clipboard (`Ctrl + c` or `cmd +c`) and pasting it (`Ctrl + v` or `cmd + v`) into the Editor UI. To select all nodes or a group of nodes, click and drag: ## From the Editor UI menu From the top navigation bar, select the three dots in the upper right to see the following options: *Import & Export workflows menu* - **Download**: Downloads your current workflow as a JSON file to your computer. - **Import from URL**: Imports workflow JSON from a URL, for example, [this workflow JSON file on GitHub](https://raw.githubusercontent.com/n8n-io/self-hosted-ai-starter-kit/refs/heads/main/n8n/demo-data/workflows/srOnR8PAY3u4RSwb.json). - **Import from File**: Imports a workflow as a JSON file from your computer. ## From the command line - Export: See the [full list of commands](../../hosting/cli-commands/#export-workflows-and-credentials) for exporting workflows or credentials. - Import: See the [full list of commands](../../hosting/cli-commands/#import-workflows-and-credentials) for importing workflows or credentials. --- ## Customer Datastore (n8n Training) node **URL:** llms-txt#customer-datastore-(n8n-training)-node Use this node only for the n8n new user onboarding tutorial. It provides dummy data for testing purposes and has no further functionality. --- ## Replace 2.1.0 with your version number **URL:** llms-txt#replace-2.1.0-with-your-version-number npm install n8n-nodes-nodeName@2.1.0 ``` --- ## DeepSeek Chat Model node **URL:** llms-txt#deepseek-chat-model-node **Contents:** - Node parameters - Model - Node options - Base URL - Frequency Penalty - Maximum Number of Tokens - Response Format - Presence Penalty - Sampling Temperature - Timeout Use the DeepSeek Chat Model node to use DeepSeek's chat models with conversational [agents](../../../../../glossary/#ai-agent). On this page, you'll find the node parameters for the DeepSeek Chat Model node and links to more resources. You can find authentication information for this node [here](../../../credentials/deepseek/). Parameter resolution in sub-nodes Sub-nodes behave differently to other nodes when processing multiple items using an expression. Most nodes, including root nodes, take any number of items as input, process these items, and output the results. You can use expressions to refer to input items, and the node resolves the expression for each item in turn. For example, given an input of five `name` values, the expression `{{ $json.name }}` resolves to each name in turn. In sub-nodes, the expression always resolves to the first item. For example, given an input of five `name` values, the expression `{{ $json.name }}` always resolves to the first name. Select the model to use to generate the completion. n8n dynamically loads models from DeepSeek and you'll only see the models available to your account. Use these options to further refine the node's behavior. Enter a URL here to override the default URL for the API. ### Frequency Penalty Use this option to control the chances of the model repeating itself. Higher values reduce the chance of the model repeating itself. ### Maximum Number of Tokens Enter the maximum number of tokens used, which sets the completion length. Choose **Text** or **JSON**. **JSON** ensures the model returns valid JSON. Use this option to control the chances of the model talking about new topics. Higher values increase the chance of the model talking about new topics. ### Sampling Temperature Use this option to control the randomness of the sampling process. A higher temperature creates more diverse sampling, but increases the risk of hallucinations. Enter the maximum request time in milliseconds. Enter the maximum number of times to retry a request. Use this option to set the probability the completion should use. Use a lower value to ignore less probable options. ## Templates and examples **🐋🤖 DeepSeek AI Agent + Telegram + LONG TERM Memory 🧠** [View template details](https://n8n.io/workflows/2864-deepseek-ai-agent-telegram-long-term-memory/) **🤖 AI content generation for Auto Service 🚘 Automate your social media📲!** [View template details](https://n8n.io/workflows/4600-ai-content-generation-for-auto-service-automate-your-social-media/) **AI Research Assistant via Telegram (GPT-4o mini + DeepSeek R1 + SerpAPI)** [View template details](https://n8n.io/workflows/5924-ai-research-assistant-via-telegram-gpt-4o-mini-deepseek-r1-serpapi/) [Browse DeepSeek Chat Model integration templates](https://n8n.io/integrations/deepseek-chat-model/), or [search all templates](https://n8n.io/workflows/) As DeepSeek is API-compatible with OpenAI, you can refer to [LangChains's OpenAI documentation](https://js.langchain.com/docs/integrations/chat/openai/) for more information about the service. View n8n's [Advanced AI](../../../../../advanced-ai/) documentation. --- ## Cisco Meraki credentials **URL:** llms-txt#cisco-meraki-credentials **Contents:** - Prerequisites - Authentication methods - Related resources - Using API key You can use these credentials to authenticate when using the [HTTP Request node](../../core-nodes/n8n-nodes-base.httprequest/) to make a [Custom API call](../../../custom-operations/). - Create a [Cisco DevNet developer account](https://developer.cisco.com). - Access to a [Cisco Meraki account](https://meraki.cisco.com/). ## Authentication methods Refer to [Cisco Meraki's API documentation](https://developer.cisco.com/meraki/api-v1/introduction/) for more information about the service. This is a credential-only node. Refer to [Custom API operations](../../../custom-operations/) to learn more. View [example workflows and related content](https://n8n.io/integrations/cisco-meraki/) on n8n's website. To configure this credential, you'll need: - An **API Key**: Refer to the [Cisco Meraki Obtaining your Meraki API Key documentation](https://developer.cisco.com/meraki/api-v1/authorization/#obtaining-your-meraki-api-key) for instructions on getting your API Key. --- ## crowd.dev credentials **URL:** llms-txt#crowd.dev-credentials **Contents:** - Prerequisites - Supported authentication methods - Related resources - Using API key You can use these credentials to authenticate the following nodes: - [crowd.dev](../../app-nodes/n8n-nodes-base.crowddev/) - [crowd.dev Trigger](../../trigger-nodes/n8n-nodes-base.crowddevtrigger/) Create a working instance of [crowd.dev](https://www.crowd.dev/). ## Supported authentication methods Refer to [crowd.dev's documentation](https://docs.crowd.dev/docs) for more information about the service, and their [API documentation](https://api.crowd.dev/api-reference) for working with the API. To configure this credential, you'll need: - A **URL**: - If your crowd.dev instance is hosted on crowd.dev, keep the default of `https://app.crowd.dev`. - If your crowd.dev instance is [self-hosted](https://docs.crowd.dev/docs/technical-docs/self-hosting), use the URL you use to access your crowd.dev instance. - Your crowd.dev **Tenant ID**: Displayed in the **Settings** section of the crowd.dev app - An API **Token**: Displayed in the **Settings** section of the crowd.dev app Refer to the [crowd.dev API documentation](https://api.crowd.dev/api-reference) for more detailed instructions. --- ## Wise credentials **URL:** llms-txt#wise-credentials **Contents:** - Prerequisites - Supported authentication methods - Related resources - Using API token - Add a private key You can use these credentials to authenticate the following nodes: - [Wise](../../app-nodes/n8n-nodes-base.wise/) - [Wise Trigger](../../trigger-nodes/n8n-nodes-base.wisetrigger/) Create a [Wise](https://wise.com/) account. ## Supported authentication methods Refer to [Wise's API documentation](https://docs.wise.com/api-docs/api-reference) for more information about the service. To configure this credential, you'll need: - An **API Token**: Go to your **user menu > Settings > API tokens** to generate an API token. Enter the generated API key in your n8n credential. Refer to [Getting started with the API](https://wise.com/help/articles/2958107/getting-started-with-the-api) for more information. - Your **Environment**: Select the environment that best matches your Wise account environment. - If you're using a Wise test sandbox account, select **Test**. - Otherwise, select **Live**. - **Private Key (Optional)**: For live endpoints requiring Strong Customer Authentication (SCA), generate a public and private key. Enter the private key here. Refer to [Add a private key](#add-a-private-key) for more information. - If you're using a **Test** environment, you'll only need to enter a Private Key if you've enabled Strong Customer Authentication on the [public keys management page](https://sandbox.transferwise.tech/public-keys). Wise protects some live endpoints and operations with Strong Customer Authentication (SCA). Refer to [Strong Customer Authentication & 2FA](https://docs.wise.com/api-docs/features/strong-customer-authentication-2fa) for details. If you make a request to an endpoint that requires SCA, Wise returns a 403 Forbidden HTTP status code. The error returned will look like this: > This request requires Strong Customer Authentication (SCA). Please add a key pair to your account and n8n credentials. See https://api-docs.transferwise.com/#strong-customer-authentication-personal-token To use endpoints requiring SCA, generate an RSA key pair and add the relevant key information to both Wise and n8n: 1. Generate an RSA key pair: 1. Add the content of the public key `public.pem` to your Wise **user menu > Settings > API tokens > Manage public keys**. 1. Add the content of the private key `private.pem` in n8n to the **Private Key (Optional)**. Refer to [Personal Token SCA](https://docs.wise.com/api-docs/guides/strong-customer-authentication-2fa/personal-token-sca) for more information. **Examples:** Example 1 (unknown): ```unknown $ openssl genrsa -out private.pem 2048 $ openssl rsa -pubout -in private.pem -out public.pem ``` --- ## AI coding with GPT **URL:** llms-txt#ai-coding-with-gpt **Contents:** - Use AI in the Code node - Usage limits - Feature limits - Writing good prompts - Example prompts - Reference incoming node data explicitly - Related resources - Fixing the code Not available on self-hosted. Python isn't supported. /// ## Use AI in the Code node AI assistance in the Code node is available to Cloud users. It isn't available in self-hosted n8n. AI generated code overwrites your code If you've already written some code on the **Code** tab, the AI generated code will replace it. n8n recommends using AI as a starting point to create your initial code, then editing it as needed. To use ChatGPT to generate code in the Code node: 1. In the Code node, set **Language** to **JavaScript**. 1. Select the **Ask AI** tab. 1. Write your query. 1. Select **Generate Code**. n8n sends your query to ChatGPT, then displays the result in the **Code** tab. During the trial phase there are no usage limits. If n8n makes the feature permanent, there may be usage limits as part of your pricing tier. The ChatGPT implementation in n8n has the following limitations: - The AI writes code that manipulates data from the n8n workflow. You can't ask it to pull in data from other sources. - The AI doesn't know your data, just the schema, so you need to tell it things like how to find the data you want to extract, or how to check for null. - Nodes before the Code node must execute and deliver data to the Code node before you run your AI query. - Doesn't work with large incoming data schemas. - May have issues if there are a lot of nodes before the code node. ## Writing good prompts Writing good prompts increases the chance of getting useful code back. - Provide examples: if possible, give a sample expected output. This helps the AI to better understand the transformation or logic you’re aiming for. - Describe the processing steps: if there are specific processing steps or logic that should apply to the data, list them in sequence. For example: "First, filter out all users under 18. Then, sort the remaining users by their last name." - Avoid ambiguities: while the AI understands various instructions, being clear and direct ensures you get the most accurate code. Instead of saying "Get the older users," you might say "Filter users who are 60 years and above." - Be clear about what you expect as the output. Do you want the data transformed, filtered, aggregated, or sorted? Provide as much detail as possible. And some n8n-specific guidance: - Think about the input data: make sure ChatGPT knows which pieces of the data you want to access, and what the incoming data represents. You may need to tell ChatGPT about the availability of n8n's built-in methods and variables. - Declare interactions between nodes: if your logic involves data from multiple nodes, specify how they should interact. "Merge the output of 'Node A' with 'Node B' based on the 'userID' property". if you prefer data to come from certain nodes or to ignore others, be clear: "Only consider data from the 'Purchases' node and ignore the 'Refunds' node." - Ensure the output is compatible with n8n. Refer to [Data structure](../../data/data-structure/) for more information on the data structure n8n requires. These examples show a range of possible prompts and tasks. #### Example 1: Find a piece of data inside a second dataset To try the example yourself, [download the example workflow](../../_workflows/ai-code/find-a-piece-of-data.json) and import it into n8n. In the third Code node, enter this prompt: > The slack data contains only one item. The input data represents all Notion users. Sometimes the person property that holds the email can be null. I want to find the notionId of the Slack user and return it. Take a look at the code the AI generates. This is the JavaScript you need: #### Example 2: Data transformation To try the example yourself, [download the example workflow](../../_workflows/ai-code/data-transformation.json) and import it into n8n. In the **Join items** Code node, enter this prompt: > Return a single line of text that has all usernames listed with a comma. Each username should be enquoted with a double quotation mark. Take a look at the code the AI generates. This is the JavaScript you need: #### Example 3: Summarize data and create a Slack message To try the example yourself, [download the example workflow](../../_workflows/ai-code/summarize-data.json) and import it into n8n. In the **Summarize** Code node, enter this prompt: > Create a markdown text for Slack that counts how many ideas, features and bugs have been submitted. The type of submission is saved in the property_type field. A feature has the property "Feature", a bug has the property "Bug" and an idea has the property "Bug". Also, list the five top submissions by vote in that message. Use "" as markdown for links. Take a look at the code the AI generates. This is the JavaScript you need: ### Reference incoming node data explicitly If your incoming data contains nested fields, using dot notation to reference them can help the AI understand what data you want. To try the example yourself, [download the example workflow](../../_workflows/ai-code/reference-incoming-data-explicitly.json) and import it into n8n. In the second Code node, enter this prompt: > The data in "Mock data" represents a list of people. For each person, return a new item containing personal_info.first_name and work_info.job_title. This is the JavaScript you need: ### Related resources Pluralsight offer a short guide on [How to use ChatGPT to write code](https://www.pluralsight.com/blog/software-development/how-use-chatgpt-programming-coding), which includes example prompts. The AI-generated code may work without any changes, but you may have to edit it. You need to be aware of n8n's [Data structure](../../data/data-structure/). You may also find n8n's built-in methods and variables useful. **Examples:** Example 1 (unknown): ```unknown const slackUser = $("Mock Slack").all()[0]; const notionUsers = $input.all(); const slackUserEmail = slackUser.json.email; const notionUser = notionUsers.find( (user) => user.json.person && user.json.person.email === slackUserEmail ); return notionUser ? [{ json: { notionId: notionUser.json.id } }] : []; ``` Example 2 (unknown): ```unknown const items = $input.all(); const usernames = items.map((item) => `"${item.json.username}"`); const result = usernames.join(", "); return [{ json: { usernames: result } }]; ``` Example 3 (unknown): ```unknown const submissions = $input.all(); // Count the number of ideas, features, and bugs let ideaCount = 0; let featureCount = 0; let bugCount = 0; submissions.forEach((submission) => { switch (submission.json.property_type[0]) { case "Idea": ideaCount++; break; case "Feature": featureCount++; break; case "Bug": bugCount++; break; } }); // Sort submissions by votes and take the top 5 const topSubmissions = submissions .sort((a, b) => b.json.property_votes - a.json.property_votes) .slice(0, 5); let topSubmissionText = ""; topSubmissions.forEach((submission) => { topSubmissionText += `<${submission.json.url}|${submission.json.name}> with ${submission.json.property_votes} votes\n`; }); // Construct the Slack message const slackMessage = `*Summary of Submissions*\n Ideas: ${ideaCount}\n Features: ${featureCount}\n Bugs: ${bugCount}\n Top 5 Submissions:\n ${topSubmissionText}`; return [{ json: { slackMessage } }]; ``` Example 4 (unknown): ```unknown const items = $input.all(); const newItems = items.map((item) => { const firstName = item.json.personal_info.first_name; const jobTitle = item.json.work_info.job_title; return { json: { firstName, jobTitle, }, }; }); return newItems; ``` --- ## MSG91 credentials **URL:** llms-txt#msg91-credentials **Contents:** - Prerequisites - Supported authentication methods - Related resources - Using API key - IP Security You can use these credentials to authenticate the following nodes: - [MSG91](../../app-nodes/n8n-nodes-base.msg91/) Create a [MSG91](https://msg91.com/) account. ## Supported authentication methods Refer to [MSG91's API documentation](https://docs.msg91.com/overview) for more information about the service. To configure this credential, you'll need: - An **Authentication Key**: To get your Authentication Key, go to the user menu and select **Authkey**. Refer to MSG91's [Where can I find my authentication key? documentation](https://msg91.com/help/api/where-can-i-find-my-authentication-ke) for more information. MSG91 enables [IP Security](https://msg91.com/help/api/what-do-you-mean-by-api-security) by default for authkeys. For the n8n credentials to function with this setting enabled, add all the [n8n IP addresses](../../../../manage-cloud/cloud-ip/) as whitelisted IPs in MSG91. You can add them in one of two places, depending on your desired security level: - To allow any/all authkeys in the account to work with n8n, add the n8n IP addresses in the **Company's whitelisted IPs** section of the **Authkey** page. - To allow only specific authkeys to work with n8n, add the n8n IP addresses in the **Whitelisted IPs** section of an authkey's details. --- ## Limit **URL:** llms-txt#limit **Contents:** - Node parameters - Max Items - Keep - Templates and examples - Related resources Use the Limit node to remove items beyond a defined maximum number. You can choose whether n8n takes the items from the beginning or end of the input data. Configure this node using the following parameters. Enter the maximum number of items that n8n should keep. If the input data contains more than this value, n8n removes the items. If the node has to remove items, select where it keeps the input items from: - **First Items**: Keeps the **Max Items** number of items from the beginning of the input data. - **Last Items**: Keeps the **Max Items** number of items from the end of the input data. ## Templates and examples **Scrape and summarize webpages with AI** [View template details](https://n8n.io/workflows/1951-scrape-and-summarize-webpages-with-ai/) **Generate Leads with Google Maps** [View template details](https://n8n.io/workflows/2605-generate-leads-with-google-maps/) **Chat with OpenAI Assistant (by adding a memory)** [View template details](https://n8n.io/workflows/2098-chat-with-openai-assistant-by-adding-a-memory/) [Browse Limit integration templates](https://n8n.io/integrations/limit/), or [search all templates](https://n8n.io/workflows/) Learn more about [data structure and data flow](../../../../data/) in n8n workflows. --- ## Toggl Trigger node **URL:** llms-txt#toggl-trigger-node [Toggl](https://toggl.com/) is a time tracking app that offers online time tracking and reporting services through their website along with mobile and desktop applications. You can find authentication information for this node [here](../../credentials/toggl/). Examples and templates For usage examples and templates to help you get started, refer to n8n's [Toggl Trigger integrations](https://n8n.io/integrations/toggl-trigger/) page. --- ## Guardrails node **URL:** llms-txt#guardrails-node **Contents:** - Node parameters - Operation - Text To Check - Guardrails - Customize System Message Use the Guardrails node to enforce safety, security, and content policies on text. You can use it to validate user input *before* sending it to an AI model, or to check the *output* from an AI model before using it in your workflow. Chat Model Connection Required for LLM-based Guardrails This node requires a Chat Model node to be connected to its Model input when using the **Check Text for Violations** operation with LLM-based guardrails. Many guardrail checks (like Jailbreak, NSFW, and Topical Alignment) are LLM-based and use this connection to evaluate the input text. Use these parameters to configure the Guardrails node. The operation mode for this node to define its behavior. - **Check Text for Violations**: Provides a full set of guardrails. Any violation will send items to **Fail** branch. - **Sanitize Text**: Provides a subset of guardrails that can detect URLs, regular expressions, secret keys, or personally identifiable information (PII), such as phone numbers and credit card numbers. The node replaces detected violations with placeholders. The text the guardrails evaluate. Typically, you map this text using an expression from a previous node, such as text from a user query or a response from an AI model. Select one or more guardrails to apply to the **Text To Check**. When you add a guardrail from the list, its specific configuration options appear below. - **Keywords:** Checks if specified keywords appear in the input text. - **Keywords**: A comma-separated list of words to block. - **Jailbreak:** Detects attempts to bypass AI safety measures or exploit the model. - **Customize Prompt**: (Boolean) If you turn this on, a text input appears with the default prompt for the jailbreak detection model. You can change this prompt to fine-tune the guardrail. - **Threshold**: A value between 0.0 and 1.0. This represents the confidence level required from the AI model to flag the input as a jailbreak attempt. A higher threshold is stricter. - **NSFW:** Detects attempts to generate Not Safe For Work (NSFW) content. - **Customize Prompt**: (Boolean) If you turn this on, a text input appears with the default prompt for the NSFW detection model. You can change this prompt to fine-tune the guardrail. - **Threshold**: A value between 0.0 and 1.0 representing the confidence level required to flag the content as NSFW. - **PII:** Detects personally identifiable information (PII) in the text. - **Type**: Choose which PII entities to scan for: - **All**: Scans for all available entity types. - **Selected**: Allows you to choose specific entities from a list. - **Entities**: (Appears if **Type** is **Selected**) A multi-select list of PII types to detect (for example, `CREDIT_CARD`, `EMAIL_ADDRESS`, `PHONE_NUMBER`, and `US_SSN`). - **Secret Keys:** Detects the presence of secret keys or API credentials in the text. - **Permissiveness**: How strict or permissive the detection should be when flagging secret keys: - **Strict** - **Permissive** - **Balanced** - **Topical Alignment:** Ensures the conversation stays within a predefined scope or topic (also known as "business scope"). - **Prompt**: A preset prompt that defines the *allowed* topic. The guardrail checks if the **Text To Check** aligns with this prompt. - **Threshold**: A value between 0.0 and 1.0 representing the confidence level required to flag the input as *off-topic*. - **URLs:** Manages URLs the node finds in the input text. It detects all URLs as violations, unless you specify them in **Block All URLs Except**. - **Block All URLs Except**: (Optional) A comma-separated list of URLs that you permit. - **Allowed Schemes**: Select the URL schemes to permit (for example, `https`, `http`, `ftp`, and `mailto`). - **Block userinfo**: (Boolean) If you turn this on, the node blocks URLs containing user credentials (for example, `user:pass@example.com`) to prevent credential injection. - **Allow subdomain**: (Boolean) If you turn this on, the node automatically allows subdomains of any URL in the **Block All URLs Except** list (for example, `sub.example.com` would be allowed if `example.com` is in the list). - **Custom:** Define your own custom, LLM-based guardrail. - **Name**: A descriptive name for your custom guardrail (for example, "Check for rude language"). - **Prompt**: A prompt that instructs the AI model what to check for. - **Threshold**: A value between 0.0 and 1.0 representing the confidence level required to flag the input as a violation. - **Custom Regex**: Define your own custom regular expression patterns. - **Name**: A name for your custom pattern. The node uses this name as a placeholder in the **Sanitize Text** mode. - **Regex**: Your regular expression pattern. ### Customize System Message If you turn this on, a text input appears with a message that the guardrail uses to enforce thresholds and JSON output according to schema. Change it to modify the global guardrails behavior. --- ## CircleCI credentials **URL:** llms-txt#circleci-credentials **Contents:** - Prerequisites - Supported authentication methods - Related resources - Using personal API token You can use these credentials to authenticate the following nodes: - [CircleCI](../../app-nodes/n8n-nodes-base.circleci/) Create a [CircleCI](https://circleci.com/) account. ## Supported authentication methods Refer to [CircleCI's API documentation](https://circleci.com/docs/api/v2/index.html) for more information about the service. ## Using personal API token To configure this credential, you'll need: - A **Personal API Token**: Refer to the [CircleCI Creating a Personal API token documentation](https://circleci.com/docs/managing-api-tokens/#creating-a-personal-api-token) for instructions on creating your token. --- ## Hybrid Analysis credentials **URL:** llms-txt#hybrid-analysis-credentials **Contents:** - Prerequisites - Supported authentication methods - Related resources - Using API key You can use these credentials to authenticate when using the [HTTP Request node](../../core-nodes/n8n-nodes-base.httprequest/) to make a [Custom API call](../../../custom-operations/). Create a [Hybrid Analysis](https://www.hybrid-analysis.com/) account. ## Supported authentication methods Refer to [Hybrid Analysis' API documentation](https://www.hybrid-analysis.com/docs/api/v2) for more information about the service. This is a credential-only node. Refer to [Custom API operations](../../../custom-operations/) to learn more. View [example workflows and related content](https://n8n.io/integrations/hybrid-analysis/) on n8n's website. To configure this credential, you'll need: - An **API Key**: Refer to the [Hybrid Analysis' API documentation](https://www.hybrid-analysis.com/docs/api/v2) for instructions on generating an API key. --- ## Postmark Trigger node **URL:** llms-txt#postmark-trigger-node [Postmark](https://postmarkapp.com) helps deliver and track application email. You can track statistics such as the number of emails sent or processed, opens, bounces and, spam complaints. You can find authentication information for this node [here](../../credentials/postmark/). Examples and templates For usage examples and templates to help you get started, refer to n8n's [Postmark Trigger integrations](https://n8n.io/integrations/postmark-trigger/) page. --- ## AWS Certificate Manager node **URL:** llms-txt#aws-certificate-manager-node **Contents:** - Operations - Templates and examples - Related resources - What to do if your operation isn't supported Use the AWS Certificate Manager node to automate work in AWS Certificate Manager, and integrate AWS Certificate Manager with other applications. n8n has built-in support for a wide range of AWS Certificate Manager features, including creating, deleting, getting, and renewing SSL certificates. On this page, you'll find a list of operations the AWS Certificate Manager node supports and links to more resources. Refer to [AWS Certificate Manager credentials](../../credentials/aws/) for guidance on setting up authentication. - Certificate - Delete - Get - Get Many - Get Metadata - Renew ## Templates and examples **Clean Up Expired AWS ACM Certificates with Slack Approval** [View template details](https://n8n.io/workflows/7626-clean-up-expired-aws-acm-certificates-with-slack-approval/) **Generate SSL/TLS Certificate Expiry Reports with AWS ACM and AI for Slack & Email** [View template details](https://n8n.io/workflows/7689-generate-ssltls-certificate-expiry-reports-with-aws-acm-and-ai-for-slack-and-email/) **Auto-Renew AWS Certificates with Slack Approval Workflow** [View template details](https://n8n.io/workflows/7490-auto-renew-aws-certificates-with-slack-approval-workflow/) [Browse AWS Certificate Manager integration templates](https://n8n.io/integrations/aws-certificate-manager/), or [search all templates](https://n8n.io/workflows/) Refer to [AWS Certificate Manager's documentation](https://docs.aws.amazon.com/acm/latest/userguide/acm-overview.html) for more information on this service. ## What to do if your operation isn't supported If this node doesn't support the operation you want to do, you can use the [HTTP Request node](../../core-nodes/n8n-nodes-base.httprequest/) to call the service's API. You can use the credential you created for this service in the HTTP Request node: 1. In the HTTP Request node, select **Authentication** > **Predefined Credential Type**. 1. Select the service you want to connect to. 1. Select your credential. Refer to [Custom API operations](../../../custom-operations/) for more information. --- ## LingvaNex node **URL:** llms-txt#lingvanex-node **Contents:** - Operations - Templates and examples Use the LingvaNex node to automate work in LingvaNex, and integrate LingvaNex with other applications. n8n has built-in support for translating data with LingvaNex. On this page, you'll find a list of operations the LingvaNex node supports and links to more resources. Refer to [LingvaNex credentials](../../credentials/lingvanex/) for guidance on setting up authentication. ## Templates and examples **Get data from Hacker News and send to Airtable or via SMS** [View template details](https://n8n.io/workflows/888-get-data-from-hacker-news-and-send-to-airtable-or-via-sms/) **Get daily poems in Telegram** [View template details](https://n8n.io/workflows/975-get-daily-poems-in-telegram/) **Translate instructions using LingvaNex** [View template details](https://n8n.io/workflows/797-translate-instructions-using-lingvanex/) [Browse LingvaNex integration templates](https://n8n.io/integrations/lingvanex/), or [search all templates](https://n8n.io/workflows/) --- ## Wolfram|Alpha credentials **URL:** llms-txt#wolfram|alpha-credentials **Contents:** - Supported authentication methods - Related resources - Using API key - Resolve Forbidden connection error You can use these credentials to authenticate the following nodes: - [Wolfram|Alpha](../../cluster-nodes/sub-nodes/n8n-nodes-langchain.toolwolframalpha/) ## Supported authentication methods Refer to [Wolfram|Alpha's Simple API documentation](https://products.wolframalpha.com/simple-api/documentation) for more information about the service. View n8n's [Advanced AI](../../../../advanced-ai/) documentation. To configure this credential, you'll need a registered [Wolfram ID](https://account.wolfram.com) and: 1. Open the Wolfram|Alpha Developer Portal and go to [**API Access**](https://developer.wolframalpha.com/access). 1. Select **Get an App ID**. 1. Enter a **Name** for your application, like `n8n integration`. 1. Enter a **Description** for your application. 1. Select **Simple API** as the **API**. 1. Select **Submit**. 1. Copy the generated **App ID** and enter it in your n8n credential. Refer to **Getting Started** in the [Wolfram|Alpha Simple API documentation](https://products.wolframalpha.com/simple-api/documentation) for more information. ## Resolve Forbidden connection error If you enter your App ID and get an error that the credential is **Forbidden**, make sure that you have verified your email address for your Wolfram ID: 1. Go to your [Wolfram ID Details](https://account.wolfram.com/wolframid). 1. If you don't see the **Verified** label underneath your **Email address**, select the link to **Send a verification email**. 1. You must open the link in that email to verify your email address. It may take several minutes for the verification to populate to the API, but once it does, retrying the n8n credential should succeed. --- ## Simple Vector Store node **URL:** llms-txt#simple-vector-store-node **Contents:** - Data safety limitations - Vector store data isn't persistent - All instance users can access vector store data - Node usage patterns - Use as a regular node to insert and retrieve documents - Connect directly to an AI agent as a tool - Use a retriever to fetch documents - Use the Vector Store Question Answer Tool to answer questions - Memory Management - Configuration Options Use the Simple Vector Store node to store and retrieve [embeddings](../../../../../glossary/#ai-embedding) in n8n's in-app memory. On this page, you'll find the node parameters for the Simple Vector Store node, and links to more resources. Parameter resolution in sub-nodes Sub-nodes behave differently to other nodes when processing multiple items using an expression. Most nodes, including root nodes, take any number of items as input, process these items, and output the results. You can use expressions to refer to input items, and the node resolves the expression for each item in turn. For example, given an input of five `name` values, the expression `{{ $json.name }}` resolves to each name in turn. In sub-nodes, the expression always resolves to the first item. For example, given an input of five `name` values, the expression `{{ $json.name }}` always resolves to the first name. This node is different from AI memory nodes The simple vector storage described here is different to the AI memory nodes such as [Simple Memory](../../sub-nodes/n8n-nodes-langchain.memorybufferwindow/). This node creates a [vector database](../../../../../glossary/#ai-vector-store) in the app memory. ## Data safety limitations Before using the Simple Vector Store node, it's important to understand its limitations and how it works. n8n recommends using Simple Vector store for development use only. ### Vector store data isn't persistent This node stores data in memory only. All data is lost when n8n restarts and may also be purged in low-memory conditions. ### All instance users can access vector store data Memory keys for the Simple Vector Store node are global, not scoped to individual workflows. This means that all users of the instance can access vector store data by adding a Simple Vector Store node and selecting the memory key, regardless of the access controls set for the original workflow. Take care not to expose sensitive information when ingesting data with the Simple Vector Store node. ## Node usage patterns You can use the Simple Vector Store node in the following patterns. ### Use as a regular node to insert and retrieve documents You can use the Simple Vector Store as a regular node to insert or get documents. This pattern places the Simple Vector Store in the regular connection flow without using an agent. You can see an example of in step 2 of [this template](https://n8n.io/workflows/2465-building-your-first-whatsapp-chatbot/). ### Connect directly to an AI agent as a tool You can connect the Simple Vector Store node directly to the [tool](../../../../../glossary/#ai-tool) connector of an [AI agent](../n8n-nodes-langchain.agent/) to use a vector store as a resource when answering queries. Here, the connection would be: AI agent (tools connector) -> Simple Vector Store node. ### Use a retriever to fetch documents You can use the [Vector Store Retriever](../../sub-nodes/n8n-nodes-langchain.retrievervectorstore/) node with the Simple Vector Store node to fetch documents from the Simple Vector Store node. This is often used with the [Question and Answer Chain](../n8n-nodes-langchain.chainretrievalqa/) node to fetch documents from the vector store that match the given chat input. An [example of the connection flow](https://n8n.io/workflows/1960-ask-questions-about-a-pdf-using-ai/) (the linked example uses Pinecone, but the pattern is the same) would be: Question and Answer Chain (Retriever connector) -> Vector Store Retriever (Vector Store connector) -> Simple Vector Store. ### Use the Vector Store Question Answer Tool to answer questions Another pattern uses the [Vector Store Question Answer Tool](../../sub-nodes/n8n-nodes-langchain.toolvectorstore/) to summarize results and answer questions from the Simple Vector Store node. Rather than connecting the Simple Vector Store directly as a tool, this pattern uses a tool specifically designed to summarizes data in the vector store. The [connections flow](https://n8n.io/workflows/2465-building-your-first-whatsapp-chatbot/) in this case would look like this: AI agent (tools connector) -> Vector Store Question Answer Tool (Vector Store connector) -> Simple Vector store. The Simple Vector Store implements memory management to prevent excessive memory usage: - Automatically cleans up old vector stores when memory pressure increases - Removes inactive stores that haven't been accessed for a configurable amount of time ### Configuration Options You can control memory usage with these environment variables: | Variable | Type | Default | Description | | ----------------------------- | ------ | ------- | ----------------------------------------------------------------------------------- | | `N8N_VECTOR_STORE_MAX_MEMORY` | Number | -1 | Maximum memory in MB allowed for all vector stores combined (-1 to disable limits). | | `N8N_VECTOR_STORE_TTL_HOURS` | Number | -1 | Hours of inactivity after which a store gets removed (-1 to disable TTL). | On n8n Cloud, these values are preset to 100MB (about 8,000 documents, depending on document size and metadata) and 7 days respectively. For self-hosted instances, both values default to -1(no memory limits or time-based cleanup). This Vector Store node has four modes: **Get Many**, **Insert Documents**, **Retrieve Documents (As Vector Store for Chain/Tool)**, and **Retrieve Documents (As Tool for AI Agent)**. The mode you select determines the operations you can perform with the node and what inputs and outputs are available. In this mode, you can retrieve multiple documents from your vector database by providing a prompt. The prompt is embedded and used for similarity search. The node returns the documents that are most similar to the prompt with their similarity score. This is useful if you want to retrieve a list of similar documents and pass them to an agent as additional context. #### Insert Documents Use insert documents mode to insert new documents into your vector database. #### Retrieve Documents (as Vector Store for Chain/Tool) Use Retrieve Documents (As Vector Store for Chain/Tool) mode with a vector-store retriever to retrieve documents from a vector database and provide them to the retriever connected to a chain. In this mode you must connect the node to a retriever node or root node. #### Retrieve Documents (as Tool for AI Agent) Use Retrieve Documents (As Tool for AI Agent) mode to use the vector store as a tool resource when answering queries. When formulating responses, the agent uses the vector store when the vector store name and description match the question details. Enables [reranking](../../../../../glossary/#ai-reranking). If you enable this option, you must connect a reranking node to the vector store. That node will then rerank the results for queries. You can use this option with the `Get Many`, `Retrieve Documents (As Vector Store for Chain/Tool)` and `Retrieve Documents (As Tool for AI Agent)` modes. ### Get Many parameters - **Memory Key**: Select or create the key containing the vector memory you want to query. - **Prompt**: Enter the search query. - **Limit**: Enter how many results to retrieve from the vector store. For example, set this to `10` to get the ten best results. ### Insert Documents parameters - **Memory Key**: Select or create the key you want to store the vector memory as. - **Clear Store**: Use this parameter to control whether to wipe the vector store for the given memory key for this workflow before inserting data (turned on). ### Retrieve Documents (As Vector Store for Chain/Tool) parameters - **Memory Key**: Select or create the key containing the vector memory you want to query. ### Retrieve Documents (As Tool for AI Agent) parameters - **Name**: The name of the vector store. - **Description**: Explain to the LLM what this tool does. A good, specific description allows LLMs to produce expected results more often. - **Memory Key**: Select or create the key containing the vector memory you want to query. - **Limit**: Enter how many results to retrieve from the vector store. For example, set this to `10` to get the ten best results. ## Templates and examples **Building Your First WhatsApp Chatbot** [View template details](https://n8n.io/workflows/2465-building-your-first-whatsapp-chatbot/) **RAG Chatbot for Company Documents using Google Drive and Gemini** [View template details](https://n8n.io/workflows/2753-rag-chatbot-for-company-documents-using-google-drive-and-gemini/) **🤖 AI Powered RAG Chatbot for Your Docs + Google Drive + Gemini + Qdrant** [View template details](https://n8n.io/workflows/2982-ai-powered-rag-chatbot-for-your-docs-google-drive-gemini-qdrant/) [Browse Simple Vector Store integration templates](https://n8n.io/integrations/in-memory-vector-store/), or [search all templates](https://n8n.io/workflows/) Refer to [LangChains's Memory Vector Store documentation](https://js.langchain.com/docs/integrations/vectorstores/memory/) for more information about the service. View n8n's [Advanced AI](../../../../../advanced-ai/) documentation. --- ## Customer Messenger (n8n Training) node **URL:** llms-txt#customer-messenger-(n8n-training)-node Use this node only for the n8n new user onboarding tutorial. It provides no further functionality. --- ## Line node **URL:** llms-txt#line-node **Contents:** - Operations - Templates and examples - What to do if your operation isn't supported Deprecated: End of service LINE Notify is discontinuing service as of April 1st 2025 and this node will no longer work after that date. View LINE Notify's [end of service announement](https://notify-bot.line.me/closing-announce) for more information. Use the Line node to automate work in Line, and integrate Line with other applications. n8n has built-in support for a wide range of Line features, including sending notifications. On this page, you'll find a list of operations the Line node supports and links to more resources. Refer to [Line credentials](../../credentials/line/) for guidance on setting up authentication. This node can be used as an AI tool This node can be used to enhance the capabilities of an AI agent. When used in this way, many parameters can be set automatically, or with information directed by AI - find out more in the [AI tool parameters documentation](../../../../advanced-ai/examples/using-the-fromai-function/). - Notification - Sends notifications to users or groups ## Templates and examples **Line Message API : Push Message & Reply** [View template details](https://n8n.io/workflows/2733-line-message-api-push-message-and-reply/) **Customer Support Channel and Ticketing System with Slack and Linear** [View template details](https://n8n.io/workflows/2323-customer-support-channel-and-ticketing-system-with-slack-and-linear/) **Send daily weather updates via a notification in Line** [View template details](https://n8n.io/workflows/773-send-daily-weather-updates-via-a-notification-in-line/) [Browse Line integration templates](https://n8n.io/integrations/line/), or [search all templates](https://n8n.io/workflows/) ## What to do if your operation isn't supported If this node doesn't support the operation you want to do, you can use the [HTTP Request node](../../core-nodes/n8n-nodes-base.httprequest/) to call the service's API. You can use the credential you created for this service in the HTTP Request node: 1. In the HTTP Request node, select **Authentication** > **Predefined Credential Type**. 1. Select the service you want to connect to. 1. Select your credential. Refer to [Custom API operations](../../../custom-operations/) for more information. --- ## Splitting workflows with conditional nodes **URL:** llms-txt#splitting-workflows-with-conditional-nodes Splitting uses the [IF](../../integrations/builtin/core-nodes/n8n-nodes-base.if/) or [Switch](../../integrations/builtin/core-nodes/n8n-nodes-base.switch/) nodes. It turns a single-branch workflow into a multi-branch workflow. This is a key piece of representing complex logic in n8n. Compare these workflows: This is the power of splitting and conditional nodes in n8n. Refer to the [IF](../../integrations/builtin/core-nodes/n8n-nodes-base.if/) or [Switch](../../integrations/builtin/core-nodes/n8n-nodes-base.switch/) documentation for usage details. --- ## User management SMTP, and two-factor authentication environment variables **URL:** llms-txt#user-management-smtp,-and-two-factor-authentication-environment-variables File-based configuration You can add `_FILE` to individual variables to provide their configuration in a separate file. Refer to [Keeping sensitive data in separate files](../../configuration-methods/#keeping-sensitive-data-in-separate-files) for more details. Refer to [User management](../../user-management-self-hosted/) for more information on setting up user management and emails. | Variable | Type | Default | Description | | ----------------------------------------------- | ------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `N8N_EMAIL_MODE` | String | `smtp` | Enable emails. | | `N8N_SMTP_HOST` | String | - | *your_SMTP_server_name* | | `N8N_SMTP_PORT` | Number | - | *your_SMTP_server_port* | | `N8N_SMTP_USER` | String | - | *your_SMTP_username* | | `N8N_SMTP_PASS` | String | - | *your_SMTP_password* | | `N8N_SMTP_OAUTH_SERVICE_CLIENT` | String | - | If using 2LO with a service account this is your client ID | | `N8N_SMTP_OAUTH_PRIVATE_KEY` | String | - | If using 2LO with a service account this is your private key | | `N8N_SMTP_SENDER` | String | - | Sender email address. You can optionally include the sender name. Example with name: *N8N ``* | | `N8N_SMTP_SSL` | Boolean | `true` | Whether to use SSL for SMTP (true) or not (false). | | `N8N_SMTP_STARTTLS` | Boolean | `true` | Whether to use STARTTLS for SMTP (true) or not (false). | | `N8N_UM_EMAIL_TEMPLATES_INVITE` | String | - | Full path to your HTML email template. This overrides the default template for invite emails. | | `N8N_UM_EMAIL_TEMPLATES_PWRESET` | String | - | Full path to your HTML email template. This overrides the default template for password reset emails. | | `N8N_UM_EMAIL_TEMPLATES_WORKFLOW_SHARED` | String | - | Overrides the default HTML template for notifying users that a workflow was shared. Provide the full path to the template. | | `N8N_UM_EMAIL_TEMPLATES_CREDENTIALS_SHARED` | String | - | Overrides the default HTML template for notifying users that a credential was shared. Provide the full path to the template. | | `N8N_UM_EMAIL_TEMPLATES_PROJECT_SHARED` | String | - | Overrides the default HTML template for notifying users that a project was shared. Provide the full path to the template. | | `N8N_USER_MANAGEMENT_JWT_SECRET` | String | - | Set a specific JWT secret. By default, n8n generates one on start. | | `N8N_USER_MANAGEMENT_JWT_DURATION_HOURS` | Number | 168 | Set an expiration date for the JWTs in hours. | | `N8N_USER_MANAGEMENT_JWT_REFRESH_TIMEOUT_HOURS` | Number | 0 | How many hours before the JWT expires to automatically refresh it. 0 means 25% of `N8N_USER_MANAGEMENT_JWT_DURATION_HOURS`. -1 means it will never refresh, which forces users to log in again after the period defined in `N8N_USER_MANAGEMENT_JWT_DURATION_HOURS`. | | `N8N_MFA_ENABLED` | Boolean | `true` | Whether to enable two-factor authentication (true) or disable (false). n8n ignores this if existing users have 2FA enabled. | | `N8N_INVITE_LINKS_EMAIL_ONLY` | Boolean | `false` | When set to true, n8n will only deliver invite links via email and will not expose them through the API. This option enhances security by preventing invite URLs from being accessible programmatically, or to high priviledged users. | --- ## WhatsApp Business Cloud node **URL:** llms-txt#whatsapp-business-cloud-node **Contents:** - Operations - Waiting for a response - Response Type - Approval response customization - Free Text response customization - Custom Form response customization - Templates and examples - Related resources - Common issues - What to do if your operation isn't supported Use the WhatsApp Business Cloud node to automate work in WhatsApp Business, and integrate WhatsApp Business with other applications. n8n has built-in support for a wide range of WhatsApp Business features, including sending messages, and uploading, downloading, and deleting media. On this page, you'll find a list of operations the WhatsApp Business Cloud node supports and links to more resources. Refer to [WhatsApp Business Cloud credentials](../../credentials/whatsapp/) for guidance on setting up authentication. - Message - Send - Send and Wait for Response - Send Template - Media - Upload - Download - Delete ## Waiting for a response By choosing the **Send and Wait for a Response** operation, you can send a message and pause the workflow execution until a person confirms the action or provides more information. You can choose between the following types of waiting and approval actions: - **Approval**: Users can approve or disapprove from within the message. - **Free Text**: Users can submit a response with a form. - **Custom Form**: Users can submit a response with a custom form. You can customize the waiting and response behavior depending on which response type you choose. You can configure these options in any of the above response types: - **Limit Wait Time**: Whether the workflow will automatically resume execution after a specified time limit. This can be an interval or a specific wall time. - **Append n8n Attribution**: Whether to mention in the message that it was sent automatically with n8n (turned on) or not (turned off). ### Approval response customization When using the Approval response type, you can choose whether to present only an approval button or both approval *and* disapproval buttons. You can also customize the button labels for the buttons you include. ### Free Text response customization When using the Free Text response type, you can customize the message button label, the form title and description, and the response button label. ### Custom Form response customization When using the Custom Form response type, you build a form using the fields and options you want. You can customize each form element with the settings outlined in the [n8n Form trigger's form elements](../../core-nodes/n8n-nodes-base.formtrigger/#form-elements). To add more fields, select the **Add Form Element** button. You'll also be able to customize the message button label, the form title and description, and the response button label. ## Templates and examples **Building Your First WhatsApp Chatbot** [View template details](https://n8n.io/workflows/2465-building-your-first-whatsapp-chatbot/) **Respond to WhatsApp Messages with AI Like a Pro!** [View template details](https://n8n.io/workflows/2466-respond-to-whatsapp-messages-with-ai-like-a-pro/) **AI-Powered WhatsApp Chatbot 🤖📲 for Text, Voice, Images & PDFs with memory 🧠** [View template details](https://n8n.io/workflows/3586-ai-powered-whatsapp-chatbot-for-text-voice-images-and-pdfs-with-memory/) [Browse WhatsApp Business Cloud integration templates](https://n8n.io/integrations/whatsapp-business-cloud/), or [search all templates](https://n8n.io/workflows/) Refer to [WhatsApp Business Platform's Cloud API documentation](https://developers.facebook.com/docs/whatsapp/cloud-api) for details about the operations. For common errors or issues and suggested resolution steps, refer to [Common Issues](common-issues/). ## What to do if your operation isn't supported If this node doesn't support the operation you want to do, you can use the [HTTP Request node](../../core-nodes/n8n-nodes-base.httprequest/) to call the service's API. You can use the credential you created for this service in the HTTP Request node: 1. In the HTTP Request node, select **Authentication** > **Predefined Credential Type**. 1. Select the service you want to connect to. 1. Select your credential. Refer to [Custom API operations](../../../custom-operations/) for more information. --- ## Strapi node **URL:** llms-txt#strapi-node **Contents:** - Operations - Templates and examples - Related resources - What to do if your operation isn't supported Use the Strapi node to automate work in Strapi, and integrate Strapi with other applications. n8n has built-in support for a wide range of Strapi features, including creating and deleting entries. On this page, you'll find a list of operations the Strapi node supports and links to more resources. Refer to [Strapi credentials](../../credentials/strapi/) for guidance on setting up authentication. - Entry - Create - Delete - Get - Get Many - Update ## Templates and examples **Enrich FAQ sections on your website pages at scale with AI** [View template details](https://n8n.io/workflows/2434-enrich-faq-sections-on-your-website-pages-at-scale-with-ai/) **Create, update, and get an entry in Strapi** [View template details](https://n8n.io/workflows/779-create-update-and-get-an-entry-in-strapi/) **Automate testimonials in Strapi with n8n** [View template details](https://n8n.io/workflows/1535-automate-testimonials-in-strapi-with-n8n/) [Browse Strapi integration templates](https://n8n.io/integrations/strapi/), or [search all templates](https://n8n.io/workflows/) Refer to [Strapi's documentation](https://docs.strapi.io/dev-docs/api/rest) for more information about the service. ## What to do if your operation isn't supported If this node doesn't support the operation you want to do, you can use the [HTTP Request node](../../core-nodes/n8n-nodes-base.httprequest/) to call the service's API. You can use the credential you created for this service in the HTTP Request node: 1. In the HTTP Request node, select **Authentication** > **Predefined Credential Type**. 1. Select the service you want to connect to. 1. Select your credential. Refer to [Custom API operations](../../../custom-operations/) for more information. --- ## Using an API playground **URL:** llms-txt#using-an-api-playground **Contents:** - Documentation playground - Built-in playground This documentation site provides a playground to test out calls. Self-hosted users also have access to a built-in playground hosted as part of their instance. ## Documentation playground You can test API calls from this site's [API reference](../api-reference/). You need to set your server's base URL and instance name, and add an API key. n8n uses [Scalar's](https://github.com/scalar/scalar) open source API platform to power this functionality. Exposed API key and data Use a test API key with limited scopes and test data when using a playground. All calls from the playground are routed through Scalar's proxy servers. You have access to your live data. This is useful for trying out requests. Be aware you can change or delete real data. ## Built-in playground The API playground isn't available on Cloud. It's available for all self-hosted pricing tiers. The n8n API comes with a built-in Swagger UI playground in self-hosted versions. This provides interactive documentation, where you can try out requests. The path to access the playground depends on your hosting. n8n constructs the path from values set in your environment variables: The API version number is `1`. There may be multiple versions available in the future. If you select **Authorize** and enter your API key in the API playground, you have access to your live data. This is useful for trying out requests. Be aware you can change or delete real data. The API includes built-in documentation about credential formats. This is available using the `credentials` endpoint: How to find `credentialTypeName` To find the type, download your workflow as JSON and examine it. For example, for a Google Drive node the `{credentialTypeName}` is `googleDriveOAuth2Api`: **Examples:** Example 1 (unknown): ```unknown N8N_HOST:N8N_PORT/N8N_PATH/api/v/docs ``` Example 2 (unknown): ```unknown N8N_HOST:N8N_PORT/N8N_PATH/api/v/credentials/schema/{credentialTypeName} ``` Example 3 (unknown): ```unknown { ..., "credentials": { "googleDriveOAuth2Api": { "id": "9", "name": "Google Drive" } } } ``` --- ## Choose your node building approach **URL:** llms-txt#choose-your-node-building-approach **Contents:** - Data handling differences - Syntax differences n8n has two node-building styles, declarative and programmatic. You should use the declarative style for most nodes. This style: - Uses a JSON-based syntax, making it simpler to write, with less risk of introducing bugs. - Is more future-proof. - Supports integration with REST APIs. The programmatic style is more verbose. You must use the programmatic style for: - Trigger nodes - Any node that isn't REST-based. This includes nodes that need to call a GraphQL API and nodes that use external dependencies. - Any node that needs to transform incoming data. - Full versioning. Refer to [Node versioning](../../build/reference/node-versioning/) for more information on types of versioning. ## Data handling differences The main difference between the declarative and programmatic styles is how they handle incoming data and build API requests. The programmatic style requires an `execute()` method, which reads incoming data and parameters, then builds a request. The declarative style handles this using the `routing` key in the `operations` object. Refer to [Node base file](../../build/reference/node-base-files/) for more information on node parameters and the `execute()` method. ## Syntax differences To understand the difference between the declarative and programmatic styles, compare the two code snippets below. This example creates a simplified version of the SendGrid integration, called "FriendGrid." The following code snippets aren't complete: they emphasize the differences in the node building styles. In programmatic style: In declarative style: **Examples:** Example 1 (unknown): ```unknown import { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription, IRequestOptions, } from 'n8n-workflow'; // Create the FriendGrid class export class FriendGrid implements INodeType { description: INodeTypeDescription = { displayName: 'FriendGrid', name: 'friendGrid', . . . properties: [ { displayName: 'Resource', . . . }, { displayName: 'Operation', name: 'operation', type: 'options', displayOptions: { show: { resource: [ 'contact', ], }, }, options: [ { name: 'Create', value: 'create', description: 'Create a contact', }, ], default: 'create', description: 'The operation to perform.', }, { displayName: 'Email', name: 'email', . . . }, { displayName: 'Additional Fields', // Sets up optional fields }, ], }; async execute(this: IExecuteFunctions): Promise { let responseData; const resource = this.getNodeParameter('resource', 0) as string; const operation = this.getNodeParameter('operation', 0) as string; //Get credentials the user provided for this node const credentials = await this.getCredentials('friendGridApi') as IDataObject; if (resource === 'contact') { if (operation === 'create') { // Get email input const email = this.getNodeParameter('email', 0) as string; // Get additional fields input const additionalFields = this.getNodeParameter('additionalFields', 0) as IDataObject; const data: IDataObject = { email, }; Object.assign(data, additionalFields); // Make HTTP request as defined in https://sendgrid.com/docs/api-reference/ const options: IRequestOptions = { headers: { 'Accept': 'application/json', 'Authorization': `Bearer ${credentials.apiKey}`, }, method: 'PUT', body: { contacts: [ data, ], }, url: `https://api.sendgrid.com/v3/marketing/contacts`, json: true, }; responseData = await this.helpers.httpRequest(options); } } // Map data to n8n data return [this.helpers.returnJsonArray(responseData)]; } } ``` Example 2 (unknown): ```unknown import { INodeType, INodeTypeDescription } from 'n8n-workflow'; // Create the FriendGrid class export class FriendGrid implements INodeType { description: INodeTypeDescription = { displayName: 'FriendGrid', name: 'friendGrid', . . . // Set up the basic request configuration requestDefaults: { baseURL: 'https://api.sendgrid.com/v3/marketing' }, properties: [ { displayName: 'Resource', . . . }, { displayName: 'Operation', name: 'operation', type: 'options', displayOptions: { show: { resource: [ 'contact', ], }, }, options: [ { name: 'Create', value: 'create', description: 'Create a contact', // Add the routing object routing: { request: { method: 'POST', url: '=/contacts', send: { type: 'body', properties: { email: {{$parameter["email"]}} } } } }, // Handle the response to contact creation output: { postReceive: [ { type: 'set', properties: { value: '={{ { "success": $response } }}' } } ] } }, ], default: 'create', description: 'The operation to perform.', }, { displayName: 'Email', . . . }, { displayName: 'Additional Fields', // Sets up optional fields }, ], } // No execute method needed } ``` --- ## Workflow management in Embed **URL:** llms-txt#workflow-management-in-embed **Contents:** - Workflow per user - 1. Obtain user credentials - 2. Create user credentials - 3. Create the workflow - Single workflow - Create the workflow - Call the workflow Embed requires an embed license. For more information about when to use Embed, as well as costs and licensing processes, refer to [Embed](https://n8n.io/embed/) on the n8n website. When managing an embedded n8n deployment, spanning across teams or organizations, you will likely need to run the same (or similar) workflows for multiple users. There are two available options for doing so: | Solution | Pros | Cons | | --------------------------------------------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------- | | Create a workflow for each user | No limitation on how workflow starts (can use any trigger) | Requires managing multiple workflows. | | Create a single workflow, and pass it user credentials when executing | Simplified workflow management (only need to change one workflow). | To run the workflow, your product must call it | The APIs referenced in this document are subject to change at any time. Be sure the check for continued functionality with each version upgrade. There are three general steps to follow: - Obtain the credentials for each user, and any additional parameters that may be required based on the workflow. - Create the [n8n credentials](../../glossary/#credential-n8n) for this user. - Create the workflow. ### 1. Obtain user credentials Here you need to capture all credentials for any node/service this user must authenticate with, along with any additional parameters required for the particular workflow. The credentials and any parameters needed will depend on your workflow and what you are trying to do. ### 2. Create user credentials After all relevant credential details have been obtained, you can proceed to create the relevant service credentials in n8n. This can be done using the Editor UI or API call. #### Using the Editor UI 1. From the menu select **Credentials** > **New**. 1. Use the drop-down to select the **Credential type** to create, for example *Airtable*. 1. In the **Create New Credentials** modal, enter the corresponding credentials details for the user, and select the nodes that will have access to these credentials. 1. Click **Create** to finish and save. The frontend API used by the Editor UI can also be called to achieve the same result. The API endpoint is in the format: `https:///rest/credentials`. For example, to create the credentials in the Editor UI example above, the request would be: With the request body: The response will contain the ID of the new credentials, which you will use when creating the workflow for this user: ### 3. Create the workflow Best practice is to have a “base” workflow that you then duplicate and customize for each new user with their credentials (and any other details). You can duplicate and customize your template workflow using either the Editor UI or API call. #### Using the Editor UI 1. From the menu select **Workflows** > **Open** to open the template workflow to be duplicated. 1. Select **Workflows** > **Duplicate**, then enter a name for this new workflow and click **Save**. 1. Update all relevant nodes to use the credentials for this user (created above). 1. **Save** this workflow set it to **Active** using the toggle in the top-right corner. 1. Fetch the JSON of the template workflow using the endpoint: `https:///rest/workflows/` The response will contain the JSON data of the selected workflow: 1. Save the returned JSON data and update any relevant credentials and fields for the new user. 1. Create a new workflow using the updated JSON as the request body at endpoint: `https:///rest/workflows` The response will contain the ID of the new workflow, which you will use in the next step. 1. Lastly, activate the new workflow: Passing the additional value `active` in your JSON payload: There are four steps to follow to implement this method: - Obtain the credentials for each user, and any additional parameters that may be required based on the workflow. See [Obtain user credentials](#1-obtain-user-credentials) above. - Create the n8n credentials for this user. See [Create user credentials](#2-create-user-credentials) above. - Create the workflow. - Call the workflow as needed. ### Create the workflow The details and scope of this workflow will vary greatly according to the individual use case, however there are a few design implementations to keep in mind: - This workflow must be triggered by a [Webhook](../../integrations/builtin/core-nodes/n8n-nodes-base.webhook/) node. - The incoming webhook call must contain the user’s credentials and any other workflow parameters required. - Each node where the user’s credentials are needed should use an [expression](../../code/expressions/) so that the node’s credential field reads the credential provided in the webhook call. - Save and activate the workflow, ensuring the production URL is selected for the Webhook node. Refer to [webhook node](../../integrations/builtin/core-nodes/n8n-nodes-base.webhook/) for more information. ### Call the workflow For each new user, or for any existing user as may be needed, call the webhook defined as the workflow trigger and provide the necessary credentials (and any other workflow parameters). **Examples:** Example 1 (unknown): ```unknown POST https:///rest/credentials ``` Example 2 (unknown): ```unknown { "name":"MyAirtable", "type":"airtableApi", "nodesAccess":[ { "nodeType":"n8n-nodes-base.airtable" } ], "data":{ "apiKey":"q12we34r5t67yu" } } ``` Example 3 (unknown): ```unknown { "data":{ "name":"MyAirtable", "type":"airtableApi", "data":{ "apiKey":"q12we34r5t67yu" }, "nodesAccess":[ { "nodeType":"n8n-nodes-base.airtable", "date":"2021-09-10T07:41:27.770Z" } ], "id":"29", "createdAt":"2021-09-10T07:41:27.777Z", "updatedAt":"2021-09-10T07:41:27.777Z" } } ``` Example 4 (unknown): ```unknown GET https:///rest/workflows/1012 ``` --- ## Taiga credentials **URL:** llms-txt#taiga-credentials **Contents:** - Prerequisites - Supported authentication methods - Related resources - Using basic auth You can use these credentials to authenticate the following nodes: - [Taiga](../../app-nodes/n8n-nodes-base.taiga/) - [Taiga Trigger](../../trigger-nodes/n8n-nodes-base.taigatrigger/) Create a [Taiga](https://taiga.io/) account. ## Supported authentication methods Refer to [Taiga's API documentation](https://docs.taiga.io/api.html) for more information about the service. To configure this credential, you'll need: - A **Username**: Enter your username or user email address. Refer to [Normal login](https://docs.taiga.io/api.html#auth-normal-login) for more information. - A **Password**: Enter your password. - The **Environment**: Choose between **Cloud** or **Self-Hosted**. For **Self-Hosted** instances, you'll also need to add: - The **URL**: Enter your Taiga URL. --- ## n8n Form node **URL:** llms-txt#n8n-form-node **Contents:** - Setting up the node - Set default selections with query parameters - Displaying custom HTML - Including hidden fields - Defining the form using JSON - Form Ending - Forms with branches - Node options - Running the node - Build and test workflows Use the n8n Form node to create user-facing forms with multiple steps. You can add other nodes with custom logic between to process user input. You must start the workflow with the [n8n Form Trigger node](../n8n-nodes-base.formtrigger/). [View workflow file](/_workflows/integrations/builtin/core-nodes/n8n-nodes-base.form/mutually-exclusive-branching.json) ## Setting up the node ### Set default selections with query parameters You can set the initial values for fields by using [query parameters](https://en.wikipedia.org/wiki/Query_string#Web_forms) with the initial URL provided by the [n8n Form Trigger node](../n8n-nodes-base.formtrigger/). Every page in the form receives the same query parameters sent to the n8n Form Trigger node URL. Query parameters are only available when using the form in production mode. n8n won't populate field values from query parameters in testing mode. When using query parameters, [percent-encode](https://en.wikipedia.org/wiki/Percent-encoding) any field names or values that use special characters. This ensures n8n uses the initial values for the given fields. You can use tools like [URL Encode/Decode](https://www.url-encode-decode.com/) to format your query parameters using percent-encoding. As an example, imagine you have a form with the following properties: - Production URL: `https://my-account.n8n.cloud/form/my-form` - Fields: - `name`: `Jane Doe` - `email`: `jane.doe@example.com` With query parameters and percent-encoding, you could use the following URL to set initial field values to the data above: Here, percent-encoding replaces the at-symbol (`@`) with the string `%40` and the space character () with the string `%20`. This will set the initial value for these fields no matter which page of the form they appear on. ### Displaying custom HTML You can display custom HTML on your form by adding a **Custom HTML** field to your form. This provides an **HTML** box where you can insert arbitrary HTML code to display as part of the form page. You can use the HTML field to enrich your form page by including things like links, images, videos, and more. n8n will render the content with the rest of the form fields in the normal document flow. Because custom HTML content is read-only, these fields aren't included in the form output data by default. To include the raw HTML content in the node output, provide a name for the data using the **Element Name** field. The HTML field doesn't support `