Abaixo, a Hora de Codar separou toda a documentação do n8n:


Name Trigger node documentation Table of Contents 

CODE_OF_CONDUCT.md 

Contributor Covenant Code of Conduct 

Our Pledge 

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. 

Our Standards 

Examples of behavior that contributes to creating a positive environment include: 

∙ Using welcoming and inclusive language 

∙ Being respectful of differing viewpoints and experiences 

∙ Gracefully accepting constructive criticism 

∙ Focusing on what is best for the community 

∙ Showing empathy towards other community members 

Examples of unacceptable behavior by participants include: 

∙ The use of sexualized language or imagery and unwelcome sexual attention or advances ∙ Trolling, insulting/derogatory comments, and personal or political attacks ∙ Public or private harassment 

∙ Publishing others’ private information, such as a physical or electronic address, without explicit permission 

∙ Other conduct which could reasonably be considered inappropriate in a professional setting 

Our Responsibilities 

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 

Scope 

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 

Enforcement 

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [email protected]. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project’s leadership. 

Attribution 

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 

For answers to common questions about this code of conduct, see https://www.contributor covenant.org/faq 

CONTRIBUTING.md 

Contributing 

If you want to contribute to this repository – thank you! Before you start, have a look at the existing documentation to get an idea of the structure and writing conventions n8n uses. In writing your documentation, please follow the guidelines described below, to ensure quality and consistency with n8n styles. 

Before you start 

Style 

n8n uses the Microsoft Writing Style Guide.

Refer to Styles for a quickstart, and guidance on style linting. 

n8n’s license 

Be aware that n8n is fair code licensed. For more information, refer to the License documentation. 

Writing docs 

You can either: 

∙ Check out the docs repository and work on your local machine. 

∙ Make your changes directly in GitHub. 

These instructions are for external users. Members of the n8n organization don’t need to fork the repository. 

Working locally 

This method allows you to work in your own text editor, and preview your work while editing. You need Git installed, and a GitHub account. 

Fork the documentation repository. 

Then clone your fork: 

git clone https://github.com/<your-username>/n8n-docs.git 

cd n8n-docs 

git checkout -b <branch-name> 

Make your changes. Push your branch: 

git add * 

git commit -m “<short summary of changes>” 

git push –set-upstream origin <branch-name> 

In GitHub, create a pull request to merge the work from your fork to main in the docs repository. Writing in GitHub 

This method is fine for small changes, but not recommended for larger pieces of work. You need a GitHub account. 

Follow GitHub’s documentation on editing files. 

Previewing your work 

You can build the docs locally to preview them, or submit a pull request. All pull requests automatically trigger a preview build. 

For instructions on previewing the docs locally, refer to the README.

General checklist 

Before submitting a PR, make sure your contribution ticks all these boxes: 

 All necessary files and images are included. 

 All links are working and direct to the right location. 

 All documentation files end with an empty newline. 

 The commit message describes the changes you made. 

 The PR explains the changes you made and why they’re necessary. 

 You have read and accepted the code of conduct and contributor license agreement. Documenting nodes 

n8n provides templates for node docs. 

Nodes and trigger nodes: Create a directory with the name of the node at docs/integrations/builtin/app-nodes/ or 

docs/integrations/builtin/trigger-nodes/ containing: 

o A text file named n8n-nodes-base.<node-name>.md describing the functionality of the relevant node. 

Credentials: Create a document with the name of the node at 

docs/integrations/builtin/credentials/ containing: 

o A text file with the node name describing how to get credentials for the relevant node. 

A standard node doc includes the following parts: 

∙ Node description 

o Describe the purpose and function of the node. 

∙ Operations 

o Enter the resources and operations as they’re named in the nodes. 

In the credentials doc: 

∙ If there is more than one authentication method, list OAuth first. 

∙ If possible, avoid documenting external products. Instead, provide links to the relevant product documentation. For example, for guidance on getting credentials (such as how to get an API token for a service), provide a link to the product’s API authentication docs.

CONTRIBUTOR_LICENSE_AGREEMENT.md 

n8n Contributor License Agreement 

I give n8n permission to license my contributions on any terms they like. I am giving them this license in order to make it possible for them to accept my contributions into their project. 

As far as the law allows, my contributions come as is, without any warranty or condition, and I will not be liable to anyone for any damages related to this software or this license, under any kind of legal claim. 

LICENSE.md 

“Commons Clause  License Condition v1.0 

The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. 

Without limiting other conditions in the License, the grant of rights under the License will not include, and the License does not grant to you, the right to Sell the Software. 

For purposes of the foregoing, “Sell  means practicing any or all of the rights granted to you under the License to provide to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license notice or attribution required by the License must also include this Commons Clause License Condition notice. 

Software: n8n 

License: Apache 2.0 

Licensor: n8n GmbH 

 Apache License 

 Version 2.0, January 2004 

 http://www.apache.org/licenses/ 

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. 

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. 

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 

“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License. 

“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. 

“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. 

“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). 

“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. 

“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.” 

“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: 

(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and 

(b) You must cause any modified files to carry prominent notices stating that You changed the files; and 

(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and 

(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. 

You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under

the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. 

END OF TERMS AND CONDITIONS 

APPENDIX: How to apply the Apache License to your work. 

 To apply the Apache License to your work, attach the following  boilerplate notice, with the fields enclosed by brackets “[]”  replaced with your own identifying information. (Don’t include  the brackets!) The text should be enclosed in the appropriate  comment syntax for the file format. We also recommend that a  file or class name and description of purpose be included on the  same “printed page” as the copyright notice for easier 

 identification within third-party archives.

Copyright [2020] [n8n GmbH] 

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at 

 http://www.apache.org/licenses/LICENSE-2.0 

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 

master-n8n-docs.md 

CODE_OF_CONDUCT.md 

Contributor Covenant Code of Conduct 

Our Pledge 

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. 

Our Standards 

Examples of behavior that contributes to creating a positive environment include: 

∙ Using welcoming and inclusive language 

∙ Being respectful of differing viewpoints and experiences 

∙ Gracefully accepting constructive criticism 

∙ Focusing on what is best for the community 

∙ Showing empathy towards other community members 

Examples of unacceptable behavior by participants include: 

∙ The use of sexualized language or imagery and unwelcome sexual attention or advances ∙ Trolling, insulting/derogatory comments, and personal or political attacks ∙ Public or private harassment 

∙ Publishing others’ private information, such as a physical or electronic address, without explicit permission 

∙ Other conduct which could reasonably be considered inappropriate in a professional setting

Our Responsibilities 

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. 

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. 

Scope 

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. 

Enforcement 

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [email protected]. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. 

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project’s leadership. 

Attribution 

This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 

For answers to common questions about this code of conduct, see https://www.contributor covenant.org/faq 

CONTRIBUTING.md 

Contributing 

If you want to contribute to this repository – thank you! Before you start, have a look at the existing documentation to get an idea of the structure and writing conventions n8n uses. In writing your documentation, please follow the guidelines described below, to ensure quality and consistency with n8n styles.

Before you start 

Style 

n8n uses the Microsoft Writing Style Guide. 

Refer to Styles for a quickstart, and guidance on style linting. 

n8n’s license 

Be aware that n8n is fair code licensed. For more information, refer to the License documentation. 

Writing docs 

You can either: 

∙ Check out the docs repository and work on your local machine. 

∙ Make your changes directly in GitHub. 

These instructions are for external users. Members of the n8n organization don’t need to fork the repository. 

Working locally 

This method allows you to work in your own text editor, and preview your work while editing. You need Git installed, and a GitHub account. 

Fork the documentation repository. 

Then clone your fork: 

git clone https://github.com/<your-username>/n8n-docs.git 

cd n8n-docs 

git checkout -b <branch-name> 

Make your changes. Push your branch: 

git add * 

git commit -m “<short summary of changes>” 

git push –set-upstream origin <branch-name> 

In GitHub, create a pull request to merge the work from your fork to main in the docs repository. Writing in GitHub 

This method is fine for small changes, but not recommended for larger pieces of work. You need a GitHub account. 

Follow GitHub’s documentation on editing files.

Previewing your work 

You can build the docs locally to preview them, or submit a pull request. All pull requests automatically trigger a preview build. 

For instructions on previewing the docs locally, refer to the README. 

General checklist 

Before submitting a PR, make sure your contribution ticks all these boxes: 

 All necessary files and images are included. 

 All links are working and direct to the right location. 

 All documentation files end with an empty newline. 

 The commit message describes the changes you made. 

 The PR explains the changes you made and why they’re necessary. 

 You have read and accepted the code of conduct and contributor license agreement. Documenting nodes 

n8n provides templates for node docs. 

Nodes and trigger nodes: Create a directory with the name of the node at docs/integrations/builtin/app-nodes/ or 

docs/integrations/builtin/trigger-nodes/ containing: 

o A text file named n8n-nodes-base.<node-name>.md describing the functionality of the relevant node. 

Credentials: Create a document with the name of the node at 

docs/integrations/builtin/credentials/ containing: 

o A text file with the node name describing how to get credentials for the relevant node. 

A standard node doc includes the following parts: 

∙ Node description 

o Describe the purpose and function of the node. 

∙ Operations 

o Enter the resources and operations as they’re named in the nodes. 

In the credentials doc: 

∙ If there is more than one authentication method, list OAuth first. 

∙ If possible, avoid documenting external products. Instead, provide links to the relevant product documentation. For example, for guidance on getting credentials (such as how to get an API token for a service), provide a link to the product’s API authentication docs.

CONTRIBUTOR_LICENSE_AGREEMENT.md 

n8n Contributor License Agreement 

I give n8n permission to license my contributions on any terms they like. I am giving them this license in order to make it possible for them to accept my contributions into their project. 

As far as the law allows, my contributions come as is, without any warranty or condition, and I will not be liable to anyone for any damages related to this software or this license, under any kind of legal claim. 

LICENSE.md 

“Commons Clause  License Condition v1.0 

The Software is provided to you by the Licensor under the License, as defined below, subject to the following condition. 

Without limiting other conditions in the License, the grant of rights under the License will not include, and the License does not grant to you, the right to Sell the Software. 

For purposes of the foregoing, “Sell  means practicing any or all of the rights granted to you under the License to provide to third parties, for a fee or other consideration (including without limitation fees for hosting or consulting/ support services related to the Software), a product or service whose value derives, entirely or substantially, from the functionality of the Software. Any license notice or attribution required by the License must also include this Commons Clause License Condition notice. 

Software: n8n 

License: Apache 2.0 

Licensor: n8n GmbH 

 Apache License 

 Version 2.0, January 2004 

 http://www.apache.org/licenses/ 

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. 

“License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. 

“Licensor” shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

“Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 

“You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License. 

“Source” form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. 

“Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. 

“Work” shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). 

“Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. 

“Contribution” shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as “Not a Contribution.” 

“Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 

2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.

3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 

4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: 

(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and 

(b) You must cause any modified files to carry prominent notices stating that You changed the files; and 

(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and 

(d) If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. 

You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 

5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under

the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 

6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 

7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 

8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 

9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. 

END OF TERMS AND CONDITIONS 

APPENDIX: How to apply the Apache License to your work. 

 To apply the Apache License to your work, attach the following  boilerplate notice, with the fields enclosed by brackets “[]”  replaced with your own identifying information. (Don’t include  the brackets!) The text should be enclosed in the appropriate  comment syntax for the file format. We also recommend that a  file or class name and description of purpose be included on the  same “printed page” as the copyright notice for easier 

 identification within third-party archives.

Copyright [2020] [n8n GmbH] 

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at 

 http://www.apache.org/licenses/LICENSE-2.0 

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 

master-n8n-docs.md 

README.md 

Banner image 

n8n Docs 

This repository hosts the documentation for n8n, an extendable workflow automation tool which enables you to connect anything to everything. The documentation is live at docs.n8n.io. 

Previewing and building the documentation locally 

Prerequisites 

∙ Python 3.8 or above 

∙ Pip 

∙ n8n recommends using a virtual environment when working with Python, such as venv. ∙ Follow the recommended configuration and auto-complete guidance for the theme. This will help when working with the mkdocs.yml file. 

∙ The repo includes a .editorconfig file. Make sure your local editor settings do not override these settings. In particular: 

o Don’t allow your editor to replace tabs with spaces. This can affect our code samples (which must retain tabs for people building nodes). 

o One tab must be equivalent to four spaces.

Steps 

For members of the n8n GitHub organization: 

1. Set up an SSH token and add it to your GitHub account. Refer to GitHub | About SSH for guidance. 

2. Then run these commands: 

git clone –recurse-submodules [email protected]:n8n-io/n8n-docs.git cd n8n-docs 

# Set up virtual environment if using one (steps depend on your system) # Install dependencies 

pip install -r requirements.txt 

pip install _submodules/insiders 

For external contributors: 

Rely on the preview builds on pull requests, or use the free version of Material for MkDocs (most things are the same, some formatting may be missing) 

Fork the repository, then: 

git clone https://github.com/<your-username>/n8n-docs.git 

cd n8n-docs 

pip install -r requirements.txt 

pip install mkdocs-material 

To serve a local preview: 

mkdocs serve 

Contributing 

Please read the CONTRIBUTING guide. 

You can find style guidance in the wiki. 

Support 

If you have problems or questions, head to n8n’s forum: https://community.n8n.io License 

n8n-docs is fair-code licensed under the Sustainable Use License

More information about the license is available in the License documentation. .github_TEMPLATE_report.md 

NOTE!

This is for issues with documentation of n8n. If the problem you are having is actually a bug in the software, please file a bug here instead. 

Where is the bug/mistake? Please help us by pasting in the URL of the page or telling us the title. 

What problem did you find? A clear and concise description of what is wrong. 

Can you suggest a fix? For some issues, like a broken link, it will help us resolve them faster if you can indicate what you think the correct information would be. 

Additional context Add any other context about the problem here. 

.github_TEMPLATE-docs-request.md 

Thanks for helping us improve docs! Please give us as much information as you can about the changes you’d like to see. 

What information is missing? 

Describe the page/pages you’d like 

Additional context Add any other context or screenshots about the feature request here. archive.md 

AI environment variables 

–8<– “_snippets/self-hosting/file-based-configuration.md” 

Variable Type Default Description N8N_AI_ENABLED Boolean false Whether AI features are enabled (true) or not (false). 

Enables Ask AI for the HTTP 

node. 

N8N_AI_PROVIDER String openai The AI provider to use. Currently, n8n only supports 

OpenAI. 

N8N_AI_OPENAI_API_ KEY 

String – Your OpenAI API key.

archive-n8n-nodes-module.md 

Creating n8n-nodes-module 

[TODO: this is the most up to date method, use it] 

In this guide, you’ll learn to create a custom n8n-nodes-module that can be installed separately alongside your n8n instance. The n8n-nodes-module is an npm package that contains the node. Your custom node will get loaded automatically when n8n starts. 

Consider creating n8n-nodes-module if any of the following conditions satisfy your needs: – The nodes are only for yourself, your organization, or a small group of people. – The nodes require external dependencies that are not already available in n8n. 

NOTE: n8n-nodes-module can only be installed in self-hosted n8n instances. This functionality is currently not available on n8n Cloud or the desktop app. There are plans to introduce this functionality in the future. 

Prerequisites 

You may already be familiar with creating nodes in n8n. If you are unfamiliar with how to create n8n nodes, you can learn about it following the instructions mentioned in the Creating Your First Node tutorial. 

Install the following tools: 

Git: You can find instructions on how to install Git here. 

Node.js and npm: You can find instructions how to install both using nvm (Node Version Manager) here. The current minimum version is 14.15. In case you already have Node.js and npm installed, you can check the current version with the following command: bash node -v npm -v 

NOTE: Use node version 14.x and npm version 6.x. If using npm version 7+, you must enable legacy peer dependencies by setting: npm config set legacy-peer-deps true. 

[TODO: remove lerna per alex] 

Lerna: You can install lerna globally with the following command: bash npm i ∙ Install n8n: Create a new folder and install n8n using the command: 

npm install n8n 

Create custom n8n-nodes-module 

You can create multiple n8n-nodes-modules. Each individual n8n-nodes-module should get created in a separate folder since they are different npm packages. A single n8n-nodes-module can contain multiple nodes. If you’re creating multiple nodes in the same module, as a best practice create each node in a separate folder.

In this tutorial, you will create an n8n-nodes-module for the OpenWeatherMap API. You will name it n8n-nodes-weather

To quickly get started, clone the example starter using the following command: git clone https://github.com/n8n-io/n8n-nodes-starter.git n8n-nodes-weather. 

After the repo gets cloned, open the package.json file, and update the value of the name by replacing n8n-nodes-starter with n8n-nodes-weather. 

NOTE: The name of the module has to start with n8n-nodes-. 

Open the cloned repository in your code editor, and create a new folder called Weather, inside the nodes folder. Create Weather.node.ts file inside the Weather folder and paste the following code: 

import

 IDataObject, 

 IExecuteFunctions, 

 INodeExecutionData, 

 INodeType, 

 INodeTypeDescription, 

 IRequestOptions, 

 NodeApiError, 

 NodeOperationError, 

} from ‘n8n-workflow’; 

export class Weather implements INodeType { 

 description: INodeTypeDescription = { 

 displayName: ‘Weather’, 

 name: ‘Weather’, 

 icon: ‘fa:sun’, 

 group: [‘input’], 

 version: 1, 

 description: ‘Gets current and future weather information’,  defaults: { 

 name: ‘Weather’, 

 color: ‘#554455’, 

 }, 

 inputs: [‘main’], 

 outputs: [‘main’], 

 credentials: [ 

 { 

 name: ‘weatherApi’, 

 required: true

 }, 

 ], 

 properties: [ 

 { 

 displayName: ‘Operation’, 

 name: ‘operation’,

 type: ‘options’, 

 options: [ 

 { 

 name: ‘Current Weather’, 

 value: ‘currentWeather’, 

 description: ‘Returns the current weather data’,  }, 

 name: ‘5 day Forecast’, 

 value: ‘5DayForecast’, 

 description: ‘Returns the weather data for the next 5 days’, 

 }, 

 ], 

 default: ‘currentWeather’, 

 description: ‘The operation to perform.’, 

 }, 

 { 

 displayName: ‘Format’, 

 name: ‘format’, 

 type: ‘options’, 

 options: [ 

 { 

 name: ‘Imperial’, 

 value: ‘imperial’, 

 description: ‘Fahrenheit | miles/hour’,  }, 

 name: ‘Metric’, 

 value: ‘metric’, 

 description: ‘Celsius | meter/sec’,  }, 

 name: ‘Scientific’, 

 value: ‘standard’, 

 description: ‘Kelvin | meter/sec’,  }, 

 ], 

 default: ‘metric’, 

 description: ‘The format in which format the data should be returned.’, 

 }, 

 // ———————————- 

 // Location Information 

 // ———————————- 

 

 displayName: ‘Location Selection’, 

 name: ‘locationSelection’, 

 type: ‘options’,

 options: [ 

 { 

 name: ‘City Name’, 

 value: ‘cityName’, 

 }, 

 name: ‘City ID’, 

 value: ‘cityId’, 

 }, 

 name: ‘Coordinates’, 

 value: ‘coordinates’, 

 }, 

 name: ‘Zip Code’, 

 value: ‘zipCode’, 

 }, 

 ], 

 default: ‘cityName’, 

 description: ‘How to define the location for which to return the weather.’, 

 }, 

 { 

 displayName: ‘City’, 

 name: ‘cityName’, 

 type: ‘string’, 

 default: ”, 

 placeholder: ‘berlin,de’, 

 required: true

 displayOptions: { 

 show: { 

 locationSelection: [ 

 ‘cityName’, 

 ], 

 }, 

 }, 

 description: ‘The name of the city to return the weather of.’, 

 }, 

 { 

 displayName: ‘City ID’, 

 name: ‘cityId’, 

 type: ‘number’, 

 default: 160001123, 

 required: true

 displayOptions: { 

 show: { 

 locationSelection: [

 ‘cityId’, 

 ], 

 }, 

 }, 

 description: ‘The id of city to return the weather of. List can be downloaded here: http://bulk.openweathermap.org/sample/’,  }, 

 { 

 displayName: ‘Latitude’, 

 name: ‘latitude’, 

 type: ‘string’, 

 default: ”, 

 placeholder: ‘13.39’, 

 required: true

 displayOptions: { 

 show: { 

 locationSelection: [ 

 ‘coordinates’, 

 ], 

 }, 

 }, 

 description: ‘The latitude of the location to return the weather of.’, 

 }, 

 { 

 displayName: ‘Longitude’, 

 name: ‘longitude’, 

 type: ‘string’, 

 default: ”, 

 placeholder: ‘52.52’, 

 required: true

 displayOptions: { 

 show: { 

 locationSelection: [ 

 ‘coordinates’, 

 ], 

 }, 

 }, 

 description: ‘The longitude of the location to return the weather of.’, 

 }, 

 { 

 displayName: ‘Zip Code’, 

 name: ‘zipCode’, 

 type: ‘string’, 

 default: ”, 

 placeholder: ‘10115,de’,

 required: true

 displayOptions: { 

 show: { 

 locationSelection: [ 

 ‘zipCode’, 

 ], 

 }, 

 }, 

 description: ‘The id of city to return the weather of. List can be downloaded here: http://bulk.openweathermap.org/sample/’,  }, 

 { 

 displayName: ‘Language’, 

 name: ‘language’, 

 type: ‘string’, 

 default: ”, 

 placeholder: ‘en’, 

 required: false

 description: ‘The two letter language code to get your output in (eg. en, de, …).’, 

 }, 

 ], 

 }; 

 async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {  const items = this.getInputData(); 

 const returnData: IDataObject[] = []; 

 const credentials = await this.getCredentials(‘openWeatherMapApi’); 

 if (credentials === undefined) { 

 throw new NodeOperationError(this.getNode(), ‘No credentials got returned!’); 

 } 

 const operation = this.getNodeParameter(‘operation’, 0) as string; 

 let endpoint = ”; 

 let locationSelection; 

 let language; 

 let qs: IDataObject; 

 for (let i = 0; i < items.length; i++) { 

 try {

 // Set base data 

 qs = { 

 APPID: credentials.accessToken, 

 units: this.getNodeParameter(‘format’, i) as string,  }; 

 // Get the location 

 locationSelection = 

this.getNodeParameter(‘locationSelection’, i) as string; 

 if (locationSelection === ‘cityName’) { 

 qs.q = this.getNodeParameter(‘cityName’, i) as string;  } else if (locationSelection === ‘cityId’) {  qs.id = this.getNodeParameter(‘cityId’, i) as number;  } else if (locationSelection === ‘coordinates’) {  qs.lat = this.getNodeParameter(‘latitude’, i) as string;  qs.lon = this.getNodeParameter(‘longitude’, i) as string;  } else if (locationSelection === ‘zipCode’) {  qs.zip = this.getNodeParameter(‘zipCode’, i) as string;  } else

 throw new NodeOperationError(this.getNode(), `The locationSelection “${locationSelection}” is not known!`); 

 } 

 // Get the language 

 language = this.getNodeParameter(‘language’, i) as string;  if (language) { 

 qs.lang = language; 

 } 

 if (operation === ‘currentWeather’) { 

 // ———————————- 

// currentWeather 

// ———————————- 

 endpoint = ‘weather’; 

 } else if (operation === ‘5DayForecast’) {  // ———————————- 

// 5DayForecast 

// ———————————- 

 endpoint = ‘forecast’; 

 } else

 throw new NodeOperationError(this.getNode(), `The operation “${operation}” is not known!`); 

 } 

 const options: IRequestOptions = { 

 method: ‘GET’,

 qs, 

uri: 

`https://api.openweathermap.org/data/2.5/${endpoint}`, 

 json: true

 }; 

 let responseData; 

 try

 responseData = await this.helpers.request(options);  } catch (error) { 

 throw new NodeApiError(this.getNode(), error);  } 

 returnData.push(responseData as IDataObject); 

 } catch (error) { 

 if (this.continueOnFail()) { 

 returnData.push({json:{ error: error.message }});  continue

 } 

 throw error; 

 } 

 } 

 return [this.helpers.returnJsonArray(returnData)];  } 

The OpenWeatherMap API requires credentials to return results successfully. Create WeatherApi.credentials.ts file in the Credentials folder and paste the following code: 

import

 ICredentialType, 

 INodeProperties, 

} from ‘n8n-workflow’; 

export class WeatherApi implements ICredentialType { 

 name = ‘weatherApi’; 

 displayName = ‘Weather API’; 

 properties: INodeProperties[] = [ 

 { 

 displayName: ‘Access Token’, 

 name: ‘accessToken’, 

 type: ‘string’, 

 default: ”, 

 }, 

 ]; 

}

Add the newly created node and the credential to the package.json file. Add “dist/nodes/Weather/Weather.node.js” to the nodes array in the n8n object (n8n.nodes). Similarly, add “dist/credentials/WeatherApi.credentials.js” to the credentials array in the n8n object (n8n.credentials). 

Develop and test the module 

Once you’ve created the n8n-nodes-module, you need to build the code and publish the package locally to test it. Run the following commands: 

# Install dependencies 

npm install 

# Build the code 

npm run build 

# “Publish” the package locally 

npm link 

NOTE: If you get permission errors, run the command as a root user with sudo, for example sudo npm link. 

In the terminal, open the folder where you installed n8n. Run the following command to install the locally published module. 

# “Install” the above locally published module 

npm link n8n-nodes-weather 

Start n8n with the below command 

./node_modules/n8n/bin/n8n start 

You will now be able to test and use your newly created n8n-nodes-module. Publish the n8n-nodes-module 

As mentioned, the n8n-nodes-module is an npm package. To make it available to others, you can publish it to the npm registry. Refer to the Publishing unscoped public packages guide to learn about publishing packages. 

Following the steps mentioned above, you can create multiple nodes within a single n8n-nodes module. You can also create nodes that require dependencies that are not present in n8n. When creating an n8n-nodes-module make sure that you follow the following guidelines: 

∙ The name of the module should start with n8n-nodes-. 

∙ The package.json file has to contain a key n8n with the paths to nodes and credentials. ∙ The module has to be installed alongside n8n.

Use the n8n-nodes-module in production 

Once you test and publish your n8n-nodes-module you would want to use it in your production environment. 

If you’re running n8n via Docker, you will have to create a Docker image with the node module installed in n8n. Follow the steps below to create your Docker image: 

1. Create a Dockerfile and paste the code from this Dockerfile. 

2. Add the following command in your Dockerfile before the font installation command. RUN cd /usr/local/lib/node_modules/n8n && npm install n8n-nodes-weather Your Dockerfile should look like this: 

FROM node:16-alpine 

ARG N8N_VERSION 

RUN if [ -z “$N8N_VERSION” ] ; then echo “The N8N_VERSION argument is missing!” ; exit 1; fi 

# Update everything and install needed dependencies 

RUN apk add –update graphicsmagick tzdata git tini su-exec 

# Set a custom user to not have n8n run as root 

USER root 

# Install n8n and the packages it needs to build it correctly. RUN apk –update add –virtual build-dependencies python3 build-base ca-certificates &&

 npm config set python “$(which python3)” &&

 npm_config_user=root npm install -g full-icu n8n@${N8N_VERSION} &&

 apk del build-dependencies \ 

 && rm -rf /root /tmp/* /var/cache/apk/* && mkdir /root

# Install your n8n-nodes-module. Replace <n8n-nodes-module> with the name of your module 

RUN cd /usr/local/lib/node_modules/n8n && npm install <n8n-nodes module> 

# Install fonts 

RUN apk –no-cache add –virtual fonts msttcorefonts-installer fontconfig &&

 update-ms-fonts &&

 fc-cache -f &&

 apk del fonts &&

 find /usr/share/fonts/truetype/msttcorefonts/ -type l -exec unlink

{} \; \ 

 && rm -rf /root /tmp/* /var/cache/apk/* && mkdir /root ENV NODE_ICU_DATA /usr/local/lib/node_modules/full-icu 

WORKDIR /data 

COPY docker-entrypoint.sh /docker-entrypoint.sh 

ENTRYPOINT [“tini”, “–“, “/docker-entrypoint.sh”] 

EXPOSE 5678/tcp 

3. Download the docker-entrypoint.sh file, and place it in the same directory as your Dockerfile. 

4. Build your Docker image: 

# Replace <n8n-version-number> with the n8n release version number. # For example, N8N_VERSION=0.177.0 

docker build –build-arg N8N_VERSION=<n8n-version-number> — tag=customizedn8n . 

You can now use your n8n-nodes-module in Docker. 

If you’re running either by installing it globally or using PM2, make sure that you install your n8n-nodes-module inside n8n. n8n will find the module and load it automatically. 

archive-trigger-node.md 

Creating Your First Trigger Node 

This tutorial walks through building a trigger node. 

Prerequisites 

You need the following installed on your development machine: 

–8<– “_snippets/integrations/creating-nodes/prerequisites.md” 

You need some understanding of: 

∙ JavaScript/TypeScript 

∙ REST APIs 

∙ Webhooks 

∙ Expressions in n8n 

∙ git

Build your node 

The first thing that we have to do is pick the service we want to create the node for. We will use Autopilot as an example. 

Since n8n’s repository already has a Autopilot Trigger node, we will name this node Autofriend Trigger to avoid conflicts. 

Step 1: Set up the project 

–8<– “_snippets/integrations/creating-nodes/tutorial-set-up-project.md” 

Creating the node 

1. Go to packages/nodes-base/nodes. 

2. Create a folder called Autofriend (the folder names are PascalCase). 3. Within the Autofriend folder, create a file called AutofriendTrigger.node.ts (YourNodeNameTrigger.node.ts). 

4. Download and add the Autofriend icon to the folder. Name it autopilot.svg. o The icon property has to be either a 60×60 pixels PNG or an SVG and must exist in the node’s folder. 

o An SVG is preferable. In case you have to use a PNG, make sure that it’s compressed. A good tool for that’s tinypng. 

o A good place to find company icons is gilbarbara/logos. 

5. Paste the following code in the AutofriendTrigger.node.ts file. 

import

 IDataObject, 

 IHookFunctions, 

 INodeType, 

 INodeTypeDescription, 

 IWebhookFunctions, 

 IWebhookResponseData, 

} from ‘n8n-workflow’; 

/* 

import { 

 autofriendApiRequest, 

} from ‘./GenericFunctions’; 

import { 

 snakeCase, 

} from ‘change-case’; 

*/ 

export class AutofriendTrigger implements INodeType { 

 description: INodeTypeDescription = { 

 displayName: ‘Autofriend Trigger’,

 name: ‘autofriendTrigger’, 

 icon: ‘file:autofriend.svg’, 

 group: [‘trigger’], 

 version: 1, 

 subtitle: ‘={{$parameter[“event”]}}’, 

 description: ‘Handle Autofriend events using webhooks’,  defaults: { 

 name: ‘Autofriend Trigger’, 

 color: ‘#6ad7b9’, 

 }, 

 inputs: [], 

 outputs: [‘main’], 

 credentials: [], 

 webhooks: [ 

 { 

 name: ‘default’, 

 httpMethod: ‘POST’, 

 responseMode: ‘onReceived’, 

 path: ‘webhook’, 

 }, 

 ], 

 properties: [], 

 }; 

 async webhook(this: IWebhookFunctions): Promise<IWebhookResponseData> {  return

 workflowData: [], 

 }; 

 } 

Your directory structure should now look like the following. 

Autofriend’s directory structure 

Autofriend’s directory structure 

Adding the node to Editor UI 

n8n uses the properties set in the property description to render the node in the Editor UI. These properties are displayName, name, color, icon, description, and subtitle. 

Check the following figure to see how the properties affect the looks of the node. 

Autofriend’s appearance in Editor UI 

Autofriend’s appearance in Editor UI 

Note: The property description conforms to INodeTypeDescription. 

Let’s see how the node looks in the UI by following these steps: 

1. Go to /packages/nodes-base/package.json.

2. Paste “dist/nodes/Autofriend/AutofriendTrigger.node.js”, in the nodes array to register the node (in an alphabetical order). 

3. Go to the project’s main folder (n8n) in the terminal and run the following commands (it can take a few minutes). 

o The first command installs all dependencies of all the modules and links them together. 

o The second command builds all the code. 

o The third command starts n8n in development mode. 

lerna bootstrap –hoist 

npm run build 

npm run dev 

4. Open your browser and go to localhost:8080 and you should be able to see the Editor UI. 5. Open the Create Node menu, select the Trigger tab, type Autofriend, and click on it to add the node to the Editor UI. 

Notes 

∙ On startup, n8n will load all the nodes and credentials (more about credentials later) that are registered in /packages/nodes-base/package.json. 

∙ The property description.name uses camelCase. 

∙ The property description.color is the company’s branding color in hexadecimal. In case the website doesn’tinclude this information, there are other websites that help you get a company’s branding colors. For example, brandpalettes.com. 

Creating the UI for the node 

Double-clicking on the Autofriend Trigger node will open the Node Editor View. It will be empty since we haven’t added any UI components yet. Luckily, n8n provides predefined JSON based UI components that we can use to ask the user for different types of data. 

Autopilots’s docs mention that to create a hook, we need to provide the following pieces of information: 

∙ event – Required 

∙ target_url – Required 

In the event parameter, we provide the name of the event for which we want to be notified. For example, contact_added. As the name implies, by providing contact_added as the event, we will be notified every time a contact is added to Autofriend. 

In the target_url parameter, we provide the URL where Autofriend will notify us when the event defined in the event parameter takes place. We don’t need to ask the user for this parameter as n8n provides us with a method to obtain it.

Adding the fields 

Let’s make the Node Editor View ask for these parameters: 1. Add the following under description.properties in packages/nodes 

base/nodes/Autofriend/AutofriendTrigger.node.ts.. 

 displayName: ‘Event’, 

 name: ‘event’, 

 type: ‘options’, 

 required: true

 default: ”, 

 options: [ 

 { 

 name: ‘Contact Added’, 

 value: ‘contactAdded’, 

 }, 

 { 

 name: ‘Contact Added To List’, 

 value: ‘contactAddedToList’, 

 }, 

 { 

 name: ‘Contact Entered Segment’, 

 value: ‘contactEnteredSegment’, 

 }, 

 { 

 name: ‘Contact Left Segment’, 

 value: ‘contactLeftSegment’, 

 }, 

 { 

 name: ‘Contact Removed From List’, 

 value: ‘contactRemovedFromList’, 

 }, 

 { 

 name: ‘Contact Unsubscribed’, 

 value: ‘contactUnsubscribed’, 

 }, 

 { 

 name: ‘Contact Updated’, 

 value: ‘contactUpdated’, 

 }, 

 ], 

}, 

2. Stop the current n8n process by pressing ctrl + c in the terminal in which you are running n8n. 

3. Run again, by entering the following in the terminal. 

npm run dev 

4. Go to localhost:8080, refresh the page, and open the node again.

The node should now look like in the following image. 

Autofriend’s required fields 

Autofriend’s required fields 

Creating the UI for credentials 

Most REST APIs use some sort of authentication mechanism. Autofriend’s REST API uses API Keys. The API Key informs them about who is making the request to their system and gives you access to all the functionality that the API provides. Given all the things it can do, this has to be treated as a sensitive piece of information and should be kept private. 

n8n gives you the ability to ask for sensitive information using credentials. In the credentials, you can use all the generally available UI elements. Additionally, the data that’s stored using the credentials would be encrypted before being saved to the database. In order to do that, n8n uses an encryption key. 

With that in mind, let’s create the UI to ask for the user’s Autofriend API Key. The process of creating and registering credentials is similar to that of creating and registering the node: 

1. Go to packages/nodes-base/credentials. 

2. Within the credentials folder, create a file named AutofriendApi.credentials.ts. 3. Paste the following code. 

import

 ICredentialType, 

 NodePropertyTypes, 

} from ‘n8n-workflow’; 

export class AutofriendApi implements ICredentialType { 

 name = ‘autofriendApi’; 

 displayName = ‘Autofriend API’; 

 properties = [ 

 { 

 displayName: ‘API Key’, 

 name: ‘apiKey’, 

 type: ‘string’ as NodePropertyTypes, 

 default: ”, 

 }, 

 ]; 

4. Go to /packages/nodes-base/package.json. 

5. Paste “dist/credentials/AutofriendApi.credentials.js”, in the credentials array to register the credentials (in an alphabetical order). 

6. Got to packages/nodes-base/nodes/Autofriend/AutofriendTrigger.node.ts. 7. Associate the credentials with the node by adding the following to 

description.credentials. 

credentials: [ 

 {

 name: ‘autofriendApi’, 

 required: true

 }, 

], 

8. Stop the current n8n process by pressing ctrl + c in the terminal in which you are running n8n. 

9. Run again, by entering the following in the terminal. 

npm run dev 

When you go to the Node Editor view, you should see the following. 

Autofriend’s create credentials 

Autofriend’s create credentials 

Autofriend’s credentials 

Autofriend’s credentials 

Understanding the life cycle for the webhook method 

When a Trigger node is executed either in test or production mode, the following happens: n8n persists all the webhooks defined in description.webhooks 

The persisted data will be used later to verify if the incoming requests to the n8n’s webhook endpoint are valid. 

The property webhooks implements the interface IWebhookDescription. The interface has four properties. 

1. name: The property name where n8n will look for the life cycle methods. 2. httpMethod: The HTTP method. 

3. responseMode: When the trigger will respond. When developing a trigger node, this property must be set to onReceived. 

4. path: The path added to the base URL. 

For example, for a Trigger node with the following webhooks property, n8n will create the following webhooks URLs. 

webhooks: [ 

 { 

 name: ‘default’, 

 httpMethod: ‘POST’, 

 responseMethod: ‘onReceived’, 

 path: ‘webhook’, 

 }, 

Test: POST {{WEBHOOK_URL || localhost}}/webhook-test/{{uuid}}/{{path}} ∙ Production: POST {{WEBHOOK_URL || localhost}}/webhook/{{uuid}}/{{path}}

These URLs can be found in the node under the Webhook URLs label. 

These webhook URLs will be used as the notification URL (also known as the callback URL or target URL) when creating the webhook in the external system. 

Note: In test mode, the webhooks are persisted in memory. In production mode, they are persisted in the database. 

n8n executes the life cycle methods 

The life cycle methods allow us to create, delete, and check if the webhook exists in the external system. 

Methods 

∙ checkExist: This is the first method that gets called. It checks if the webhook with the current path is already registered in the external system or not. If the webhook is already registered, n8n persists the webhook ID. If the webhook isn’t registered with the external system, the create method gets executed. 

∙ create: This method gets called if the checkExist method returns false (if the webhook with the current path doesn’texist in the external system). This method registers the webhook in the external system and stores the webhook ID in n8n. 

∙ delete: This method gets called when the trigger is either stopped manually or when the workflow is deactivated. It uses the ID previously persisted by either the create or the checkExist method to delete the webhook from the external system. 

Lifecycle flowchart 

Lifecycle flowchart 

Wait for new events to trigger the workflow 

Every time the external system notifies us about a change, by making an HTTP Request to the URL we previously registered in the create method, the execute method is called. Within this method, we have access to the request object and everything it contains. For example, body, headers, querystring, etc. The data the method returns is the data we want the rest of the workflow to have access to. 

Let’s see how this would look for our current use-case: 

1. Go to packages/nodes-base/nodes/Autofriend, create a file named GenericFunctions.ts, and paste the following code. 

import

 IDataObject, 

 IExecuteFunctions, 

 IHookFunctions, 

 ILoadOptionsFunctions, 

 IRequestOptions, 

 IWebhookFunctions, 

} from ‘n8n-workflow’;

export async function autofriendApiRequest(this: IExecuteFunctions | IWebhookFunctions | IHookFunctions | ILoadOptionsFunctions, method: string, resource: string, body: any = {}, query: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any 

 const credentials = await this.getCredentials(‘autofriendApi’) as IDataObject; 

 const apiKey = credentials.apiKey; 

 const endpoint = ‘https://api2.autopilothq.com/v1’; 

 const options: IRequestOptions = { 

 headers: { 

 ‘Content-Type’: ‘application/json’, 

 autopilotapikey: apiKey, 

 }, 

 method, 

 body, 

 qs: query, 

 uri: uri || `${endpoint}${resource}`, 

 json: true

 }; 

 if (!Object.keys(body).length) { 

 delete options.body; 

 } 

 if (!Object.keys(query).length) { 

 delete options.qs; 

 } 

 try

 return await this.helpers.request!(options); 

 } catch (error) { 

 if (error.response) { 

 const errorMessage = error.response.body.message || error.response.body.description || error.message; 

 throw new Error(`Autopilot error response [${error.statusCode}]: ${errorMessage}`); 

 } 

 throw error; 

 } 

2. Go to packages/nodes-base/nodes/AutofriendTrigger.node.ts and add the following code after the property description. 

// @ts-ignore 

webhookMethods = { 

 default: { 

 async checkExists(this: IHookFunctions): Promise<boolean> {

 const webhookData = this.getWorkflowStaticData(‘node’);  const webhookUrl = this.getNodeWebhookUrl(‘default’);  const event = this.getNodeParameter(‘event’) as string;  const { hooks: webhooks } = await autofriendApiRequest.call(this, ‘GET’, ‘/hooks’); 

 for (const webhook of webhooks) { 

 if (webhook.target_url === webhookUrl && webhook.event === snakeCase(event)) { 

 webhookData.webhookId = webhook.hook_id;  return true

 } 

 } 

 return false

 }, 

 async create(this: IHookFunctions): Promise<boolean> {  const webhookUrl = this.getNodeWebhookUrl(‘default’);  const webhookData = this.getWorkflowStaticData(‘node’);  const event = this.getNodeParameter(‘event’) as string;  const body: IDataObject = { 

 event: snakeCase(event), 

 target_url: webhookUrl, 

 }; 

 const webhook = await autofriendApiRequest.call(this, ‘POST’, ‘/hook’, body); 

 webhookData.webhookId = webhook.hook_id; 

 return true

 }, 

 async delete(this: IHookFunctions): Promise<boolean> {  const webhookData = this.getWorkflowStaticData(‘node’);  try

 await autofriendApiRequest.call(this, ‘DELETE’, `/hook/${webhookData.webhookId}`); 

 } catch (error) { 

 return false

 } 

 delete webhookData.webhookId; 

 return true

 }, 

 }, 

}; 

3. Replace the webhook function with the following. 

async webhook(this: IWebhookFunctions): Promise<IWebhookResponseData> {  const req = this.getRequestObject(); 

 return

 workflowData: [ 

 this.helpers.returnJsonArray(req.body), 

 ], 

};

4. In the same file, uncomment the code snippet on the top to import 

autoFriendApiRequest and snakeCase. 

5. Stop the current n8n process by pressing ctrl + c in the terminal where you are running n8n. 

6. Run the project using a tunnel by entering ./packages/cli/bin/n8n start –tunnel in the terminal. Access the n8n Editor UI at localhost:5678. 

7. Enter the API key in the credentials. Instructions to find the API Key can be found here. 8. Go to the workflow editor, save your workflow, and execute the node. Executed node 

Executed node 

9. Log into Autopilot and update a contact. Keep in mind that this should be done within two minutes after you executed the node. After that time frame, the webhook will be unregistered automatically and you will not be able to receive the event. If it takes you longer than that, please execute the node and update the contact again. 

Executed node with results 

Executed node with results 

The trigger node is now receiving events. Sometimes it might take a bit longer for the payload to arrive. 

You probably noticed that this time we did not run the project using npm run dev, but instead using ./packages/cli/bin/n8n start –tunnel. 

Since our server is running locally, we need a tool that lets us proxy all requests to our local machine so that n8n receives and handles the events from the external service (Autopilot). This gets achieved using a tunnel. The details on how a tunnel works are out of the scope of this tutorial. If you want to know about it, you can check this link. Keep in mind that the tunnel is meant for development purposes only and shouldn’t be used in production. 

Test your node 

–8<– “_snippets/integrations/creating-nodes/testing.md” 

Next steps 

∙ Deploy your node. 

∙ View an example of a declarative node: n8n’s Brevo node{:target=_blank .external-link}. Note that the main node is declarative, while the trigger node is in programmatic style. ∙ Learn about node versioning. 

# archive 

.md

$item(index: number, runIndex?: number) 

With $item you can access the data of parent nodes. That can be the item data but also the parameters. It expects as input an index of the item the data should be returned for. This is needed because for each item the data returned can be different. This is probably straightforward for the item data itself but maybe less for data like parameters. The reason why it is also needed, is that they may contain an expression. Expressions get always executed of the context for an item. If that would not be the case, for example, the Email Send node not would be able to send multiple emails at once to different people. Instead, the same person would receive multiple emails. 

The index is 0 based. So $item(0) will return the first item, $item(1) the second one, and so on. 

By default the item of the last run of the node will be returned. So if the referenced node ran 3x (its last runIndex is 2) and the current node runs the first time (its runIndex is 0) the data of runIndex 2 of the referenced node will be returned. 

For more information about what data can be accessed via $node, check out the Variable: $node section. 

Example: 

// Returns the value of the JSON data property “myNumber” of Node “Set” (first item) 

const myNumber = $item(0).$node[“Set”].json[“myNumber”]; 

// Like above but data of the 6th item 

const myNumber = $item(5).$node[“Set”].json[“myNumber”]; 

// Returns the value of the parameter “channel” of Node “Slack”. // If it contains an expression the value will be resolved with the // data of the first item. 

const channel = $item(0).$node[“Slack”].parameter[“channel”]; // Like above but resolved with the value of the 10th item. const channel = $item(9).$node[“Slack”].parameter[“channel”]; 

archive8n-nodes-base.cron.md 

Cron 

The Cron node is useful to schedule the workflows to run periodically at fixed dates, times, or intervals. This works in a similar way to the cron software utility in Unix-like systems. This core node is a Trigger node. 

/// note | Keep in mind 1. If a workflow is using the Cron node as a trigger, make sure that you save and activate the workflow. /// 2. Make sure that the timezone is set correctly for the n8n instance (or the workflow).

Node Reference 

You can configure the node by clicking on the Add Cron Time button under the Trigger Times section. There are a couple of different options available for the Mode field in the form of a dropdownlist. 

∙ Mode 

o Every Minute 

o Every Hour 

o Every Day 

o Every Week 

o Every Month 

o Every X 

o Custom 

The ‘Every X’ option allows you to specify the workflow to be triggered every x minutes or hours. You can specify x by entering a number in the Value field. The ‘Custom’ option allows you to enter a custom cron expression in the Cron Expression field. 

FAQs 

How to generate a custom Cron expression? 

To generate a Cron expression, you can use crontab guru. Paste the Cron expression that you generated using crontab guru in the Cron Expression field in n8n. 

Why there are six asterisks (*) in the Cron Expression? 

The sixth asterisk in the Cron Expression represents seconds. Setting this is optional. The node will execute even if you don’t set the value for seconds. 

* * * * * * 

second minute hour day week month 

If you want to trigger your workflow, for example, every day at 04:08:30, enter the following in the Cron Expression field. 

30 8 4 * * * 

If you want to trigger your workflow, for example, every day at 04:08, enter the following in the Cron Expression field. 

8 4 * * *

archive8n-nodes-base.function.md 

Function 

/// warning | Deprecated in 0.198.0 n8n deprecated this node in version 0.198.0. Older workflows continue to work, and the node is still available in older versions n8n. From 0.198.0, n8n replaces the Function node with the Code node. /// Using the function node, you can: 

∙ Transform data from other nodes 

∙ Implement custom functionality 

/// note | Function node and function item node Note that the Function node is different from the Function Item node. Refer to Data | Code to learn about the difference between the two. /// 

The Function 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. 

When working with the Function node, you need to understand the following concepts: 

∙ Data structure: understand the data you receive in the Function node, and requirements for outputting data from the node. 

∙ Item linking: learn how data items work. You need to handle item linking when the number of input and output items doesn’t match. 

n8n provides 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 methods and variables for more information. 

Output items 

When using the Function node, you must return data in the format described in data structure. This example creates 10 items with the IDs 0 to 9: 

const newItems = []; 

for (let i=0;i<10;i++) { 

 newItems.push({ 

 json: { 

 id: i 

 }

 }); 

return newItems; 

Manage item linking 

–8<– “_snippets/data/data-mapping/item-linking-code-node.md” 

External libraries 

If you self-host n8n, you can import and use built-in and external npm modules in the Function node. To learn how to enable external modules, refer the Configuration guide. 

archive8n-nodes-base.functionItem.md 

Function Item 

/// warning | Deprecated in 0.198.0 n8n deprecated this node in version 0.198.0. Older workflows continue to work, and the node is still available in older versions n8n. From 0.198.0, n8n replaces the Function node with the Code node. /// The Function Item node is used to add custom snippets to JavaScript code that should be executed once for every item that it receives as the input. 

/// note | Keep in mind Please note that the Function Item node is different from the Function node. Check out this page to learn about the difference between the two. /// 

The Function Item node supports promises. So instead of returning the items directly, it is also possible to return a promise which resolves accordingly. 

It also provides the ability to write to your browser console using console.log, useful for debugging and troubleshooting your workflows. 

Node Reference 

You can also use the methods and variables mentioned in the Expressions page in the Function Item node. 

Variable: item 

It contains the “json” data of the currently processed item. 

The data can be accessed and manipulated like this: 

// Uses the data of an already existing key to create a new additional one item.newIncrementedCounter = item.existingCounter + 1; 

return item;

Method: getBinaryData() 

Returns all the binary data (all keys) of the item which gets currently processed. 

item.filename = getBinaryData().attachment_0.fileName; 

return item; 

Method: setBinaryData(binaryData) 

Sets all the binary data (all keys) of the item which gets currently processed. Method: getWorkflowStaticData(type) 

This gives access to the static workflow data. It is possible to save data directly with the workflow. This data should, however, be very small. A common use case is to for example to save a timestamp of the last item that got processed from an RSS-Feed or database. It will always return an object. Properties can then read, delete or set on that object. When the workflow execution succeeds, n8n will check automatically if the data has changed and will save it, if necessary. 

There are two types of static data. The “global” and the “node” one. Global static data is the same in the whole workflow. And every node in the workflow can access it. The node static data, however, is different for every node and only the node which set it can retrieve it again. 

Note: The static data cannot be read and written when executing via manual executions. The data will always be empty, and the changes will not persist. The static data will only be saved when a workflow is active. 

Example 

// Get the global workflow static data 

const staticData = getWorkflowStaticData(‘global’); 

// Get the static data of the node 

const staticData = getWorkflowStaticData(‘node’); 

// Access its data 

const lastExecution = staticData.lastExecution; 

// Update its data 

staticData.lastExecution = new Date().getTime(); 

// Delete data 

delete staticData.lastExecution; 

External libraries 

You can import and use built-in and external npm modules in the Function Item node. To learn how to enable external modules, refer the Configuration guide.

archive8n-nodes 

base.venafitlsprotectdatacentertrigger.md 

Venafi TLS Protect Datacenter Trigger 

Venafi{:target=_blank .external-link} is a cybersecurity company providing services for machine identity management. They offer solutions to manage and protect identities for a wide range of machine types, delivering global visibility, lifecycle automation, and actionable intelligence. 

/// note | Credentials You can find authentication information for this node here. /// archive8n-nodes-langchain.chainretrievalqa.md 

Retrieval QA Chain 

The Retrieval QA Chain node allows you to answer a query based on document content indexed by a retriever. 

On this page, you’ll find the node parameters for the Retrieval QA Chain node, and links to more resources. 

/// note | Examples and templates For usage examples and templates to help you get started, refer to n8n’s LangChain integrations{:target=_blank .external-link} page. /// ## Node parameters 

Query 

This is the prompt that the model will use. 

What can you tell me about {{ $json.input }} 

Choose a mode 

There are two modes: 

Run Once for All Items: this is the default. When your workflow runs, the chain will run once, regardless of how many input items there are. 

Run Once for Each Item: choose this if you want your chain to run for every input item. Related resources 

View example workflows and related content{:target=_blank .external-link} on n8n’s website. 

Refer to LangChain’s documentation on Retrieval QA{:target=_blank .external-link} for more information about the service. 

–8<– “_snippets/integrations/builtin/cluster-nodes/langchain-overview-link.md”

archive8n-nodes-langchain.retrievervectorstore.md 

Name 

On this page, you’ll find the node parameters for the Name node, and links to more resources. 

/// note | Credentials You can find authentication information for this node here. /// /// note | Examples and templates For usage examples and templates to help you get started, refer to n8n’s LangChain integrations{:target=_blank .external-link} page. /// ## Node parameters 

Bullet list 

Of available operations

Related resources 

View example workflows and related content{:target=_blank .external-link} on n8n’s website. 

Refer to Name’s documentation{:target=_blank .external-link} for more information about the service. 

–8<– “_snippets/integrations/builtin/cluster-nodes/langchain-overview-link.md” archive-developer-cli.md 

Using the Node Dev CLI 

Using the Node Dev CLI makes sense if you do not want to ever share the node that you create. For example, for internal systems or something very specific to your internal tooling. Also, the CLI only works if there are no additional dependencies required by the node as it does not support installing additional node modules. 

If that is not the case, it is best to do follow the creating your first node tutorial or create your own custom node-package. 

Create the first basic node 

1. Install the n8n-node-dev CLI: npm install -g n8n-node-dev 

2. Create and go into the newly created folder in which you want to keep the code of the node 

3. Use CLI to create boilerplate node code: n8n-node-dev new 

4. Answer the questions (the “Execute  node type is the regular node type that you probably want to create). It will then create the node in the current folder. 5. Program… Add the functionality to the node 

6. Build the node and copy to correct location: n8n-node-dev build That command will build the JavaScript version of the node from the TypeScript code and copy it to the user folder where custom nodes get read from ~/.n8n/custom/

7. Restart n8n and refresh the window so that the new node gets displayed Create own custom n8n-nodes-module 

If you want to create multiple custom nodes which are either: 

∙ Only for yourself/your company 

∙ Are only useful for a small number of people 

∙ Require many or large dependencies 

!!! note To learn how to develop and test n8n-nodes-module, refer to the Create n8n-nodes module documentation. 

It is best to create your own n8n-nodes-module which can be installed separately. That is an npm package that contains the nodes and is set up in a way that n8n can automatically find and load them on startup. 

When creating such a module the following rules have to be followed that n8n can automatically find the nodes in the module: 

∙ The name of the module has to start with n8n-nodes- 

∙ The package.json file has to contain a key n8n with the paths to nodes and credentials ∙ The module has to be installed alongside n8n 

An example starter module which contains one node and credentials and implements the above can be found here: 

https://github.com/n8n-io/n8n-nodes-starter

Setup to use n8n-nodes-module 

To use a custom n8n-nodes-module, it needs to be installed alongside n8n. For example like this: 

# Create folder for n8n installation 

mkdir my-n8n 

cd my-n8n 

# Install n8n 

npm install n8n 

# Install custom nodes module 

npm install n8n-nodes-my-custom-nodes 

# Start n8n 

n8n 

Development/Testing of custom n8n-nodes-module 

This works in the same way as for any other npm module.

Execute in the folder which contains the code of the custom n8n-nodes-module which should be loaded with n8n: 

# Build the code 

npm run build 

# “Publish” the package locally 

npm link 

Then in the folder in which n8n is installed: 

# “Install” the above locally published module 

npm link n8n-nodes-my-custom-nodes 

# Start n8n 

n8n 

archive-flow-logic.md 

[TODO: I’m not sure this page is helpful, especially if focused on a dev audience] Plan your workflow logic 

When you build a workflow, you create a set of instructions for how to process data. This can include: 

∙ Accessing external applications to retrieve and export data. 

∙ Manipulating data. 

∙ Performing different actions based on the data. 

To define your data process, you link nodes together in a sequence. This is your workflow logic. n8n supports complex logic. 

/// Details | What is data? In n8n, data is any information processed by the workflow. n8n formats data as JSON. Refer to Data for more information on the data structure, and working with n8n workflow data. /// ## Fetch data 

Your workflow needs data. There are three main ways to get this data: 

∙ From the trigger node that starts the workflow. For example, if you use the Gmail trigger to start a workflow in response to an event in Gmail, the Gmail trigger node provides data about the event. 

∙ Using an app node to retrieve data. For example, you can use the Gmail node to fetch information from Gmail (after starting the workflow with a different trigger). ∙ Generate the data within the workflow. For example, you can use the Code node to create data.

Manipulate data 

archive-checklist.md 

Node review checklist 

This checklist helps you build a node that meets the standards for submission to the community nodes collection. It also helps ensure that nodes are consistent and good quality. 

Preparation 

Set up your editor for code formatting (indentation, new lines, linting). If you use Visual Studio Code, you can use the TSLint extension{:target=_blank .external-link} for linting. Get credentials (for example, Client ID, Client Secret, API key, user login, user password, website URL) for the service you are building a node for. 

Development 

If you’re creating a node requested by a community member, make sure to comment on the feature request in the community forum{:target=_blank .external-link}. Add complementary operations to each resource (for example, create, delete) Programmatic-style only. Check the 

node works with more than one input item. Ensure the parameters have the correct type. Mind the defaults: if the service has a default as true, keep it as true. Changing default values can break the existing workflows of the users. Check if the node disposes of everything. In particular, the node has closed all connections. Check your code using the node linter. 

Testing 

Test “create” and “update” operations with all fields/operations. Test the continueOnFail option with a Function node. For example, a Widget node has a GET operation that takes a widgetId and returns information on the widget. To test that the workflow continues on fail, set the Widget node to continue on fail, create a Function node, return a valid and an invalid widgetId, connect the Function node to Widget node, and run the workflow. The Widget node should show two items: one with information on the widget and another one with the error from having passed an invalid ID.) 

Code formatting 

Ensure the package lints cleanly by running npm run lint. Ensure the indentation is correct. Check this in the editor configuration. Ensure there are no extra spaces. Check this in the editor configuration. Code comment dividers inside if-branches. Use “create/delete” verbs for operations, except for tags, where you should use “add/remove.”

Errors and outputs 

Ensure empty API responses return { success: true }. Ensure the node handles and displays error responses (for example, malformed requests, requests with invalid credentials) and use the current format. You can check this by making failing requests to the API. Check if you can simplify the response. If so, add a simplify function (for example, SecurityScorecard node{:target=_blank .external-link}). Ensure the response from Create is consistent with Get.  Ensure the response from Get All is consistent with Get. 

Presentation 

The primary menu shouldn’t contain optional parameters. Ensure a JSON object isn’t shown in a single column in Table view. Make sure all GetAll operations have the fields return and limit. Set the property subtitle. Make sure the pagination (if any) is working. Set Limit 1. 

Writing 

Ensure all descriptions are correct and end with a period. Ensure that most descriptions exist, excluding redundant ones. Capitalize IDs in displayNames (for example: “IDs” not “ids” or “Ids”). If there is more than one ID, ensure they have descriptive qualifiers. Ensure the name property in description in the node class is in camelCase. Ensure the file name and the class name are identical. 

Branding 

Check that brand names are correct (for example, “GitHub” not “Github”). If the node is a trigger node, show this in the name by adding “Trigger” after the service name (for example, “Trello Trigger”). Ensure the logo is either a PNG or SVG, ideally the latter. Vecta{:target=_blank .external-link} is a good website to find SVGs of different applications. If the logo is an SVG, ensure the canvas is a perfect square. If the logo is PNG, ensure it’s 60×60 pixels and compressed. Ensure the border color of the node matches the branding of the service. 

Nice-to-haves (optional) 

Add handler for continueOnFail. This handler continues the workflow even if the node’s execution fails. Remove required: false and description: ” in the node descriptions (for example, Lemlist node{:target=_blank .external-link}). At call site, specify first body and then qs. At call site, prepend the endpoint with slash / (for example, “/campaign”). 

archive-icon-square-nodes-list.md 

–8<– “_snippets/node-icon-square/core-nodes/compression.html” –8<– “_snippets/node-icon square/core-nodes/cron.html” –8<– “_snippets/node-icon-square/core-nodes/crypto.html” –8<– “_snippets/node-icon-square/core-nodes/date-and-time.html” –8<– “_snippets/node-icon square/core-nodes/edit-image.html” –8<– “_snippets/node-icon-square/core-nodes/error trigger.html” –8<– “_snippets/node-icon-square/core-nodes/execute-command.html” –8<– “_snippets/node-icon-square/core-nodes/execute-workflow.html” –8<– “_snippets/node-icon-

square/core-nodes/function-item.html” –8<– “_snippets/node-icon-square/core nodes/function.html” –8<– “_snippets/node-icon-square/core-nodes/git.html” –8<– “_snippets/node-icon-square/core-nodes/html-extract.html” –8<– “_snippets/node-icon square/core-nodes/http-request.html” –8<– “_snippets/node-icon-square/core nodes/icalendar.html” –8<– “_snippets/node-icon-square/core-nodes/n8n-nodes-base.if.html” – 8<– “_snippets/node-icon-square/core-nodes/imap-email.html” –8<– “_snippets/node-icon square/core-nodes/interval.html” –8<– “_snippets/node-icon-square/core-nodes/item-lists.html” –8<– “_snippets/node-icon-square/core-nodes/local-file-trigger.html” –8<– “_snippets/node icon-square/core-nodes/merge.html” –8<– “_snippets/node-icon-square/core-nodes/move binary-data.html” –8<– “_snippets/node-icon-square/core-nodes/n8n-trigger.html” –8<– “_snippets/node-icon-square/core-nodes/no-operation-do-nothing.html” –8<– “_snippets/node icon-square/core-nodes/read-binary-file.html” –8<– “_snippets/node-icon-square/core nodes/read-binary-files.html” –8<– “_snippets/node-icon-square/core-nodes/read-pdf.html” –8<– “_snippets/node-icon-square/core-nodes/rename-keys.html” –8<– “_snippets/node-icon square/core-nodes/respond-to-webhook.html” –8<– “_snippets/node-icon-square/core-nodes/rss read.html” –8<– “_snippets/node-icon-square/core-nodes/send-email.html” –8<– “_snippets/node-icon-square/core-nodes/set.html” –8<– “_snippets/node-icon-square/core nodes/split-in-batches.html” –8<– “_snippets/node-icon-square/core-nodes/spreadsheet file.html” –8<– “_snippets/node-icon-square/core-nodes/sse-trigger.html” –8<– “_snippets/node icon-square/core-nodes/ssh.html” –8<– “_snippets/node-icon-square/core-nodes/start.html” –8<– “_snippets/node-icon-square/core-nodes/stop-and-error.html” –8<– “_snippets/node-icon square/core-nodes/switch.html” –8<– “_snippets/node-icon-square/core-nodes/wait.html” –8<– “_snippets/node-icon-square/core-nodes/webhook.html” –8<– “_snippets/node-icon-square/core nodes/workflow-trigger.html” –8<– “_snippets/node-icon-square/core-nodes/write-binary file.html” –8<– “_snippets/node-icon-square/core-nodes/xml.html” 

docs\1-0-migration-checklist.md 

n8n v1.0 migration guide 

This document provides a summary of what you should be aware of before updating to version 1.0 of n8n. 

The release of n8n 1.0 marks a milestone in n8n’s journey to make n8n available for demanding production environments. Version 1.0 represents the hard work invested over the last four years to make n8n the most accessible, powerful, and versatile automation tool. n8n 1.0 is now ready for use in production. 

New features 

Python support in the Code node 

Although JavaScript remains the default language, you can now also select Python as an option in the Code node and even make use of many Python modules{:target=_blank .external link}. Note that Python is unavailable in Code nodes added to a workflow before v1.0.

PR #4295{:target=_blank .external link}, PR #6209{:target=_blank .external link} Execution order 

n8n 1.0 introduces a new execution order for multi-branch workflows: 

In multi-branch workflows, n8n needs to determine the order in which to execute nodes on branches. Previously, n8n executed the first node of each branch, then the second of each branch, and so on (breadth-first). The new execution order ensures that each branch executes completely before starting the next one (depth-first). Branches execute based on their position on the canvas, from top to bottom. If two branches are at the same height, the leftmost one executes first. 

n8n used to execute multi-input nodes as long as they received data on their first input. Nodes connected to the second input of multi-input nodes automatically executed regardless of whether they received data. The new execution order introduced in n8n 1.0 simplifies this behavior: Nodes are now executed only when they receive data, and multi-input nodes require data on at least one of their inputs to execute. 

Your existing workflows will use the legacy order, while new workflows will execute using the v1 order. You can configure the execution order for each workflow in workflow settings. 

PR #4238{:target=_blank .external link}, PR #6246{:target=_blank .external link}, PR #6507{:target=_blank .external link} 

Deprecations 

MySQL and MariaDB 

n8n has removed support for MySQL and MariaDB as storage backends for n8n. These database systems are used by only a few users, yet they require continuous development and maintenance efforts. n8n recommends migrating to PostgreSQL for better compatibility and long-term support. 

PR #6189{:target=_blank .external link} 

EXECUTIONS_PROCESS and “own” mode 

Previously, you could use the EXECUTIONS_PROCESS environment variable to specify whether executions should run in the main process or in their own processes. This option and own mode are now deprecated and will be removed in a future version of n8n. This is because it led to increased code complexity while offering marginal benefits. Starting from n8n 1.0, main will be the new default. 

Note that executions start much faster in main mode than in own mode. However, if a workflow consumes more memory than is available, it might crash the entire n8n application instead of just the worker thread. To mitigate this, make sure to allocate enough system resources or configure queue mode to distribute executions among multiple workers. 

PR #6196{:target=_blank .external link}

Breaking changes 

Docker 

Permissions change 

When using Docker-based deployments, the n8n process is now run by the user node instead of root. This change increases security. 

If permission errors appear in your n8n container logs when starting n8n, you may need to update the permissions by executing the following command on the Docker host: 

docker run –rm -it –user root -v ~/.n8n:/home/node/.n8n –entrypoint chown n8nio/base:16 -R node:node /home/node/.n8n 

Image removal 

We’ve removed the Debian and RHEL images. If you were using these you need to change the image you use. This shouldn’t result in any errors unless you were making a custom image based on one of those images. 

Entrypoint change 

The entrypoint for the container has changed and you no longer need to specify the n8n command. If you were previously running n8n worker –concurrency=5 it’s now worker — concurrency=5 

PR #6365{:target=_blank .external link} 

Workflow failures due to expression errors 

Workflow executions may fail due to syntax or runtime errors in expressions, such as those that reference non-existent nodes. While expressions already throw errors on the frontend, this change ensures that n8n also throws errors on the backend, where they were previously silently ignored. To receive notifications of failing workflows, n8n recommends setting up an “error workflow” under workflow settings. 

PR #6352{:target=_blank .external link} 

Mandatory owner account 

This change makes User Management mandatory and removes support for other authentication methods, such as BasicAuth and External JWT. Note that the number of permitted users on n8n.cloud{:target=_blank .external link} or custom plans still varies depending on your subscription. 

PR #6362{:target=_blank .external link} 

Directory for installing custom nodes 

n8n will no longer load custom nodes from its global node_modules directory. Instead, you must install (or link) them to ~/.n8n/custom (or a directory defined by N8N_CUSTOM_EXTENSIONS).

Custom nodes that are npm packages will be located in ~/.n8n/nodes. If you have custom nodes that were linked using npm link into the global node_modules directory, you need to link them again, into ~/.n8n/nodes instead. 

PR #6396{:target=_blank .external link} 

WebSockets 

The N8N_PUSH_BACKEND environment variable can be used to configure one of two available methods for pushing updates to the user interface: sse and websocket. Starting with n8n 1.0, websocket is the default method. 

PR #6196{:target=_blank .external link} 

Date transformation functions 

n8n provides various transformation functions that operate on dates. These functions may return either a JavaScript Date or a Luxon DateTime object. With the new behavior, the return type always matches the input. If you call a date transformation function on a Date, it returns a Date. Similarly, if you call it on a DateTime object, it returns a DateTime object. 

To identify any workflows and nodes that might be impacted by this change, you can use this utility workflow{:target=_blank .external link}. 

For more information about date transformation functions, please refer to the official documentation. 

PR #6435{:target=_blank .external link} 

Execution data retention 

Starting from n8n 1.0, all successful, failed, and manual workflow executions will be saved by default. These settings can be modified for each workflow under “Workflow Settings,” or globally using the respective environment variables. Additionally, the EXECUTIONS_DATA_PRUNE setting will be enabled by default, with EXECUTIONS_DATA_PRUNE_MAX_COUNT set to 10,000. These default settings are designed to prevent performance degradation when using SQLite. Make sure to configure them according to your individual requirements and system capacity. 

PR #6577{:target=_blank .external link} 

Removed N8N_USE_DEPRECATED_REQUEST_LIB 

The legacy request library has been deprecated for some time now. As of n8n 1.0, the ability to fall back to it in the HTTP Request node by setting the N8N_USE_DEPRECATED_REQUEST_LIB environment variable has been fully removed. The HTTP Request node will now always use the new HttpRequest interface. 

If you build custom nodes, refer to HTTP request helpers for more information on migrating to the new interface. 

PR #6413{:target=_blank .external link}

Removed WEBHOOK_TUNNEL_URL 

As of version 0.227.0, n8n has renamed the WEBHOOK_TUNNEL_URL configuration option to WEBHOOK_URL. In n8n 1.0, WEBHOOK_TUNNEL_URL has been removed. Update your setup to reflect the new name. For more information about this configuration option, refer to the docs. 

PR #1408{:target=_blank .external link} 

Remove Node 16 support 

n8n now requires Node 18.17.0 or above. 

Updating to n8n 1.0 

1. Create a full backup of n8n. 

2. n8n recommends updating to the latest n8n 0.x release before updating to n8n 1.x. This will allow you to pinpoint any potential issues to the correct release. Once you have verified that n8n 0.x starts up without any issues, proceed to the next step. 

3. Carefully read the Deprecations and Breaking Changes sections above to assess how they may affect your setup. 

4. Update to n8n 1.0: 

o During beta (before July 24th 2023): If using Docker, pull the next Docker image. 

o After July 24th 2023: If using Docker, pull the latest Docker image. 5. If you encounter any issues, redeploy the previous n8n version and restore the backup. 

Reporting issues 

If you encounter any issues during the process of updating to n8n 1.0, please seek help in the community forum{:target=_blank .external link}. 

Thank you 

We would like to take a moment to express our gratitude to all of our users for their continued support and feedback. Your contributions are invaluable in helping us make n8n the best possible automation tool. We’re excited to continue working with you as we move forward with the release of version 1.0 and beyond. Thank you for being a part of our journey! 

docs-n8n.md 

Choose your n8n 

This section contains information on n8n’s range of platforms, pricing plans, and licenses. Platforms 

There are different ways to set up n8n depending on how you intend to use it:

∙ n8n Cloud: hosted solution, no need to install anything. 

∙ Self-host: recommended method for production or customized use cases. o npm 

o Docker 

o Server setup guides for popular platforms 

∙ Embed: n8n Embed allows you to white label n8n and build it into your own product. Contact n8n on the Embed website{:target=_blank .external-link} for pricing and support. 

–8<– “_snippets/self-hosting/warning.md” 

Licenses 

n8n’s Sustainable Use License{:target=_blank .external-link} and n8n Enterprise License{:target=_blank .external-link} are based on the fair-code model. 

For a detailed explanation of the license, refer to Sustainable Use License. Free versions 

n8n offers the following free options: 

∙ A free trial of Cloud 

∙ A free self-hosted community edition for self-hosted users 

Paid versions 

n8n has two paid versions: 

∙ n8n Cloud: choose from a range of paid plans to suit your usage and feature needs. ∙ Self-hosted: there are both free and paid versions of self-hosted. 

For details of the Cloud plans and contact details for Enterprise Self-hosted, refer to Pricing{:target=_blank .external-link} on the n8n website. 

docs-secrets.md 

External secrets 

/// info | Feature availability * External secrets are available on Enterprise Self-hosted and Enterprise Cloud plans. * n8n supports AWS Secrets Manager, Azure Key Vault, GCP Secrets Manager, Infisical and HashiCorp Vault. * n8n doesn’t support HashiCorp Vault Secrets{:target=_blank .external-link}. /// 

You can use an external secrets store to manage credentials for n8n.

n8n stores all credentials encrypted in its database, and restricts access to them by default. With the external secrets feature, you can store sensitive credential information in an external vault, and have n8n load it in when required. This provides an extra layer of security and allows you to manage credentials used across multiple n8n environments in one central place. 

Connect n8n to your secrets store 

/// note | Secret names Your secret names can’t contain spaces, hyphens, or other special characters. n8n supports secret names containing alphanumeric characters (a-z, A-Z, and 0-9), and underscores. n8n currently only supports plaintext values for secrets, not JSON objects or key-value pairs. /// 

1. In n8n, go to Settings > External Secrets

2. Select Set Up for your store provider. 

3. Enter the credentials for your provider: 

o Azure Key Vault: Provide your vault name, tenant ID, client ID, and client secret. Refer to the Azure documentation to register a Microsoft Entra ID app and create a service principal{:target=_blank .external-link}. n8n supports only single-line values for secrets. 

o AWS Secrets Manager: provide your access key ID, secret access key, and region. The IAM user must have the secretsmanager:ListSecrets, 

secretsmanager:BatchGetSecretValue, and 

secretsmanager:GetSecretValue permissions. 

To give n8n access to all secrets in your AWS Secrets Manager, you can attach the following policy to the IAM user: json { “Version”: “2012-10- 17”, “Statement”: [ { “Sid”: 

“AccessAllSecrets”, “Effect”: “Allow”,  

“Action”: [ “secretsmanager:ListSecrets”,  “secretsmanager:BatchGetSecretValue”,  

“secretsmanager:GetResourcePolicy”,  

“secretsmanager:GetSecretValue”,  

“secretsmanager:DescribeSecret”, 

“secretsmanager:ListSecretVersionIds”, ],  

“Resource”: “*” } ] } 

You can also be more restrictive and give n8n access to select specific AWS Secret Manager secrets. You still need to allow the 

secretsmanager:ListSecrets and secretsmanager:BatchGetSecretValue permissions to access all resources. These permissions allow n8n to retrieve ARN-scoped secrets, but don’t provide access to the secret values. 

Next, you need set the scope for the secretsmanager:GetSecretValue permission to the specific Amazon Resource Names (ARNs) for the secrets you wish to share with n8n. Ensure you use the correct region and account ID in each resource ARNs. You can find the ARN details in the AWS dashboard for your secrets.

For example, the following IAM policy only allows access to secrets with a name starting with n8n in your specified AWS account and region: 

 “Version”: “2012-10-17”, 

 “Statement”: [ 

 { 

 “Sid”: “ListingSecrets”, 

 “Effect”: “Allow”, 

 “Action”: [ 

 “secretsmanager:ListSecrets”, 

 “secretsmanager:BatchGetSecretValue”  ], 

 “Resource”: “*” 

 }, 

 { 

 “Sid”: “RetrievingSecrets”, 

 “Effect”: “Allow”, 

 “Action”: [ 

 “secretsmanager:GetSecretValue”, 

 “secretsmanager:DescribeSecret” 

 ], 

 “Resource”: [ 

 “arn:aws:secretsmanager:us-west 

2:123456789000:secret:n8n*” 

 ] 

 } 

 ] 

For more IAM permission policy examples, consult the AWS 

documentation{:target=_blank .external-link}. 

o HashiCorp Vault: provide the Vault URL for your vault instance, and select your Authentication Method. Enter your authentication details. Optionally provide a namespace. 

▪ Refer to the HashiCorp documentation for your authentication method: Token auth method{:target=_blank .external-link} 

AppRole auth method{:target=_blank .external-link} 

Userpass auth method{:target=_blank .external-link} 

▪ If you use vault namespaces, you can enter the namespace n8n should connect to. Refer to Vault Enterprise namespaces{:target=_blank .external-link} for more information on HashiCorp Vault namespaces. 

o Infisical: provide a Service Token. Refer to Infisical’s Service token{:target=_blank .external-link} documentation for information on getting your token. If you self-host Infisical, enter the Site URL.

/// note | Infisical environment Make sure you select the correct Infisical 

environment when creating your token. n8n will load secrets from this 

environment, and won’t have access to secrets in other Infisical environments. n8n only support service tokens that have access to a single environment. /// 

/// note | Infisical folders n8n doesn’t support Infisical folders{:target=_blank .external-link}. /// 

o Google Cloud Platform: provide a Service Account Key (JSON) for a service account that has at least these roles: Secret Manager Secret Accessor and Secret Manager Secret Viewer. Refer to Google’s service account 

documentation{:target=_blank .external-link} for more information. 

4. Save your configuration. 

5. Enable the provider using the Disabled / Enabled toggle. 

Use secrets in n8n credentials 

To use a secret from your store in an n8n credential: 

1. Create a new credential, or open an existing one. 

2. On the field where you want to use a secret: 

1. Hover over the field. 

2. Select Expression

3. In the field where you want to use a secret, enter an expression referencing the secret name: js {{ $secrets.<vault-name>.<secret-name> }} <vault-name> is either vault (for HashiCorp) or infisical or awsSecretsManager. Replace <secret-name> with the name as it appears in your vault. 

Using external secrets with n8n environments 

n8n’s Source control and environments feature allows you to create different n8n environments, backed by Git. The feature doesn’t support using different credentials in different instances. You can use an external secrets vault to provide different credentials for different environments by connecting each n8n instance to a different vault or project environment. 

For example, you have two n8n instances, one for development and one for production. You use Infisical for your vault. In Infisical, create a project with two environments, development and production. Generate a token for each Infisical environment. Use the token for the development environment to connect your development n8n instance, and the token for your production environment to connect your production n8n instance. 

Using external secrets in projects 

To use external secrets in an RBAC project, you must have an instance owner or instance admin as a member of the project.

Troubleshooting 

Infisical version changes 

Infisical version upgrades can introduce problems connecting to n8n. If your Infisical connection stops working, check if there was a recent version change. If so, report the issue to [email protected]

Only set external secrets on credentials owned by an instance owner or admin 

Due to the permissions that instance owners and admins have, it’s possible for owners and admins to update credentials owned by another user with a secrets expression. This will appear to work in preview for an instance owner or admin, but the secret won’t resolve when the workflow runs in production. 

Only use external secrets for credentials that are owned by an instance admin or owner. This ensures they resolve correctly in production. 

docs.md 

AI agent 

AI agents are artificial intelligence systems capable of responding to requests, making decisions, and performing real-world tasks for users. They use large language models (LLMs) to interpret user input and make decisions about how to best process requests using the information and resources they have available. 

AI chain 

AI chains allow you to interact with large language models (LLMs) and other resources in sequences of calls to components. AI chains in n8n don’t use persistent memory, so you can’t use them to reference previous context (use AI agents for this). 

AI embedding 

Embeddings are numerical representations of data using vectors. They’re used by AI to interpret complex data and relationships by mapping values across many dimensions. Vector databases, or vector stores, are databases designed to store and access embeddings. 

AI memory 

In an AI context, memory allows AI tools to persist message context across interactions. This allows you to have a continuing conversations with AI agents, for example, without submitting ongoing context with each message. In n8n, AI agent nodes can use memory, but AI chains can’t. 

AI tool 

In an AI context, a tool is an add-on resource that the AI can refer to for specific information or functionality when responding to a request. The AI model can use a tool to interact with external systems or complete specific, focused tasks.

AI vector store 

Vector stores, or vector databases, are databases designed to store numerical representations of information called embeddings. 

API 

APIs, or application programming interfaces, offer programmatic access to a service’s data and functionality. APIs make it easier for software to interact with external systems. They’re often offered as an alternative to traditional user-focused interfaces accessed through web browsers or UI. 

canvas (n8n) 

The canvas is the main interface for building workflows in n8n’s editor UI. You use the canvas to add and connect nodes to compose workflows. 

cluster node (n8n) 

In n8n, cluster nodes are groups of nodes that work together to provide functionality in a workflow. They consist of a root node and one or more sub nodes that extend the node’s functionality. 

credential (n8n) 

In n8n, credentials store authentication information to connect with specific apps and services. After creating credentials with your authentication information (username and password, API key, OAuth secrets, etc.), you can use the associated app node to interact with the service. 

data pinning (n8n) 

Data pinning allows you to temporarily freeze the output data of a node during workflow development. This allows you to develop workflows with predictable data without making repeated requests to external services. Production workflows ignore pinned data and request new data on each execution. 

editor (n8n) 

The n8n editor UI allows you to create and manage workflows. The main area is the canvas, where you can compose workflows by adding, configuring, and connecting nodes. The side and top panels allow you to access other areas of the UI like credentials, templates, variables, executions, and more. 

entitlement (n8n) 

In n8n, entitlements grant n8n instances access to plan-restricted features for a specific period of time. 

Floating entitlements are a pool of entitlements that you can distribute among various n8n instances. You can re-assign a floating entitlement to transfer its access to a different n8n instance.

evaluation (n8n) 

In n8n, evaluation allows you to tag and organize execution history and compare it against new executions. You can use this to understand how your workflow performs over time as you make changes. In particular, this is useful while developing AI-centered workflows. 

expression (n8n) 

In n8n, expressions allow you to populate node parameters dynamically by executing JavaScript code. Instead of providing a static value, you can use the n8n expression syntax to define the value using data from previous nodes, other workflows, or your n8n environment. 

LangChain 

LangChain is an AI-development framework used to work with large language models (LLMs). LangChain provides a standardized system for working with a wide variety of models and other resources and linking different components together to build complex applications. 

Large language model (LLM) 

Large language models, or LLMs, are AI machine learning models designed to excel in natural language processing (NLP) tasks. They’re built by training on large amounts of data to develop probabilistic models of language and other data. 

node (n8n) 

In n8n, nodes are individual components that you compose to create workflows. Nodes define when the workflow should run, allow you to fetch, send, and process data, can define flow control logic, and connect with external services. 

project (n8n) 

n8n projects allow you to separate workflows, variables, and credentials into separate groups for easier management. Projects make it easier for teams to collaborate by sharing and compartmentalizing related resources. 

root node (n8n) 

Each n8n cluster node contains a single root nodes that defines the main functionality of the cluster. One or more sub nodes attach to the root node to extend its functionality. 

sub node (n8n) 

n8n cluster nodes consist of one or more sub nodes connected to a root node. Sub nodes extend the functionality of the root node, providing access to specific services or resources or offering specific types of dedicated processing, like calculator functionality, for example. 

template (n8n) 

n8n templates are pre-built workflows designed by n8n and community members that you can import into your n8n instance. When using templates, you may need to fill in credentials and adjust the configuration to suit your needs.

trigger node (n8n) 

A trigger node is a special node responsible for executing the workflow in response to certain conditions. All production workflows need at least one trigger to determine when the workflow should run. 

workflow (n8n) 

An n8n workflow is a collection of nodes that automate a process. Workflows begin execution when a trigger condition occurs and execute sequentially to achieve complex tasks. 

docs.md 

Welcome to n8n Docs 

This is the documentation for n8n{:target=_blank .external-link}, a fair-code{:target=_blank .external-link} licensed workflow automation tool that combines AI capabilities with business process automation. 

It covers everything from setup to usage and development. It’s a work in progress and all contributions are welcome. 

Where to start 

Quickstarts 

Jump in with n8n’s quickstart guides. 

:octicons-arrow-right-24: Try it out 

Choose the right n8n for you 

Cloud, npm, self-host . . . 

:octicons-arrow-right-24: Options 

Explore integrations 

Browse n8n’s integrations library. 

:octicons-arrow-right-24: Find your apps 

Build AI functionality 

n8n supports building AI functionality and tools. 

:octicons-arrow-right-24: Advanced AI

About n8n 

n8n (pronounced n-eight-n) helps you to connect any app with an API with any other, and manipulate its data with little or no code. 

∙ Customizable: highly flexible workflows and the option to build custom nodes. ∙ Convenient: use the npm or Docker to try out n8n, or the Cloud hosting option if you want us to handle the infrastructure. 

∙ Privacy-focused: self-host n8n for privacy and security. 

docs.md 

Insights 

Insights gives instance owners and admins visibility into how workflows perform over time. This feature consists of three parts: 

Insights summary banner: Shows key metrics about your instance from the last 7 days at the top of the overview space. 

Insights dashboard: A more detailed visual breakdown with per-workflow metrics and historical comparisons. 

Time saved (Workflow ROI): For each workflow, you can set the number of minutes of work that each production execution saves you. 

/// info | Feature availability The insights summary banner displays activity from the last 7 days for all plans. The insights dashboard is only available on Pro (with limited date ranges) and Enterprise plans. /// 

Insights summary banner 

n8n collects several metrics for both the insights summary banner and dashboard. They include: 

∙ Total production executions (not including sub-workflow executions or manual executions) 

∙ Total failed production executions 

∙ Production execution failure rate 

∙ Time saved (when set on at least one or more active workflows) 

∙ Run time average (including wait time from any wait nodes) 

Insights dashboard 

Those on the Pro and Enterprise plans can access the Insights section from the side navigation. Each metric from the summary banner is also clickable, taking you to the corresponding chart.

The insights dashboard also has a table showing individual insights from each workflow including total production executions, failed production executions, failure rate, time saved, and run time average. 

Insights time periods 

By default, the insights summary banner and dashboard show a rolling 7 day window with a comparison to the previous period to identify increases or decreases for each metric. On the dashboard, paid plans also display data for other date ranges: 

∙ Pro: 7 and 14 days 

∙ Enterprise: 24 hours, 7 days, 14 days, 30 days, 90 days, 6 months, 1 year Setting the time saved by a workflow 

For each workflow, you can set the number of minutes of work a workflow saves you each time it runs. You can configure this by navigating to the workflow, selecting the three dots menu in the top right and selecting settings. There you can update the Estimated time saved value and save. 

This setting helps you calculate how much time automating a process saves over time vs the manual effort to complete the same task or process. Once set, n8n calculates the amount of time the workflow saves you based on the number of production executions and displays it on the summary banner and dashboard. 

Disable or configure insights metrics collection 

If you self-host n8n, you can disable or configure insights and metrics collection using environment variables. 

Insights FAQs 

Which executions do n8n use to calculate the values in the insights banner and dashboard? 

n8n insights only collects data from production executions (for example, those from active workflows triggered on a schedule or a webhook) from the main (parent) workflow. This means that it doesn’t count manual (test) executions or executions from sub-workflows or error workflows. 

Does n8n use historic execution data when upgrading to a version with insights? 

n8n only starts collecting data for insights once you update to the first supported version (1.89.0). This means it only reports on executions from that point forward and you won’t see execution data in insights from prior periods.

docs-shortcuts.md 

Keyboard shortcuts and controls 

n8n provides keyboard shortcuts for some actions. 

Workflow controls 

Ctrl + Alt + n: create new workflow 

Ctrl + o: open workflow 

Ctrl + s: save the current workflow 

Ctrl + z: undo 

Ctrl + shift + z: redo 

Ctrl + Enter: execute workflow 

Canvas 

Move the canvas 

Ctrl + Left Mouse Button + drag: move node view 

Ctrl + Middle mouse button + drag: move node view 

Space + drag: move node view 

Middle mouse button + drag: move node view 

∙ Two fingers on a touch screen: move node view 

Canvas zoom 

+ or =: zoom in 

or **_**: zoom out 

0: reset zoom level 

1: zoom to fit workflow 

Ctrl + Mouse wheel: zoom in/out 

Nodes on the canvas 

Double click on a node: open the node details 

Ctrl/Cmd + Double click on a sub-workflow node: open the sub-workflow in a new tab ∙ Ctrl + a: select all nodes 

Ctrl + v: paste nodes 

Shift + s: add sticky note 

With one or more nodes selected in canvas 

ArrowDown: select sibling node below the current one 

ArrowLeft: select node left of the current one 

ArrowRight: select node right of the current one

ArrowUp: select sibling node above the current one 

Ctrl + c: copy 

Ctrl + x: cut 

D: deactivate 

Delete: delete 

Enter: open 

F2: rename 

P: pin data in node. Refer to Data pinning for more information. 

Shift + ArrowLeft: select all nodes left of the current one 

Shift + ArrowRight: select all nodes right of the current one 

Ctrl/Cmd + Shift + o on a sub-workflow node: open the sub-workflow in a new tab Node panel 

Tab: open the Node Panel 

Enter: insert selected node into workflow 

Escape: close Node panel 

Node panel categories 

Enter: insert node into workflow, collapse/expand category, open subcategory ∙ ArrowRight: expand category, open subcategory 

ArrowLeft: collapse category, close subcategory view 

Within nodes 

=: in an empty parameter input, this switches to expressions mode. 

docs-path.md 

This guide outlines a series of tutorials and resources designed to get you started with n8n. 

It’s not necessary to complete all items listed to start using n8n. Use this as a reference to navigate to the most relevant parts of the documentation and other resources according to your needs. 

Join the community 

n8n has an active community where you can get and offer help. Connect, share, and learn with other n8n users: 

∙ Ask questions{:target=_blank .external-link} and make feature requests{:target=_blank .external-link} in the Community Forum. 

∙ Report bugs{:target=_blank .external-link} and contribute{:target=_blank .external-link} on GitHub.

Set up your n8n 

If you don’t have an account yet, sign up to a free trial on n8n Cloud{:target=_blank .external link} or install n8n’s community edition with Docker (recommended) or npm. See Choose your n8n for more details. 

Try it out 

Start with the quickstart guides to help you get up and running with building basic workflows. 

∙ A very quick quickstart 

∙ A longer introduction 

∙ Build an AI workflow in n8n 

Structured Courses 

n8n offers two sets of courses. 

Video courses 

Learn key concepts and n8n features, while building examples as you go. 

∙ The Beginner{:target=_blank .external-link} course covers the basics of n8n. ∙ The Advanced{:target=_blank .external-link} course covers more complex workflows, more technical nodes, and enterprise features 

Text courses 

Build more complex workflows while learning key concepts along the way. Earn a badge and an avatar in your community profile. 

∙ Level 1: Beginner Course{:target=_blank .external-link} 

∙ Level 2: Intermediate Course{:target=_blank .external-link} 

Self-hosting n8n 

Explore various self-hosting options in n8n. If you’re not sure where to start, these are two popular options: 

∙ Hosting n8n on DigitalOcean 

∙ Hosting n8n on Amazon Web Services 

Build a node 

If you can’t find a node for a specific app or a service, you can build a node yourself and share with the community. See what others have built on npm website{:target=_blank .external-link}. 

∙ Build a declarative-style node 

∙ Learn how to build your own n8n nodes (Youtube Video){:target=_blank .external-link}

Stay updated 

∙ Follow new features and bug fixes in the Release Notes 

∙ Follow n8n on socials: Twitter/X{:target=_blank .external-link}, Discord{:target=_blank .external-link}, LinkedIn{:target=_blank .external-link}, YouTube{:target=_blank .external-link} 

docs-key.md 

License Key 

To enable certain licensed features, you must first activate your license. You can do this either through the UI or by setting environment variables. 

Add a license key using the UI 

In your n8n instance: 

1. Log in as Admin or Owner

2. Select Settings > Usage and plan

3. Select Enter activation key

4. Paste in your license key. 

5. Select Activate

Add a license key using an environment variables 

In your n8n configuration, set N8N_LICENSE_ACTIVATION_KEY to your license key. If the instance already has an activated license, this variable will have no effect. 

Refer to Environment variables to learn more about configuring n8n. 

Allowlist the license server IP addresses 

n8n uses Cloudflare to host the license server. As the specific IP addresses can change, you need to allowlist the full range of Cloudflare IP addresses to ensure n8n can always reach the license server. 

docs-streaming.md 

Log streaming 

/// info | Feature availability Log streaming is available on Enterprise Self-hosted and Cloud plans. ///

Log streaming allows you to send events from n8n to your own logging tools. This allows you to manage your n8n monitoring in your own alerting and logging processes. 

Set up log streaming 

To use log streaming, you have to add a streaming destination. 

1. Navigate to Settings > Log Streaming

2. Select Add new destination

3. Choose your destination type. n8n opens the New Event Destination modal. 4. In the New Event Destination modal, enter the configuration information for your event destination. These depend on the type of destination you’re using. 

5. Select Events to choose which events to stream. 

6. Select Save

/// note | Self-hosted users If you self-host n8n, you can configure additional log streaming behavior using Environment variables. /// ## Events 

The following events are available. You can choose which events to stream in Settings > Log Streaming > Events

∙ Workflow 

o Started 

o Success 

o Failed 

∙ Node executions 

o Started 

o Finished 

∙ Audit 

o User signed up 

o User updated 

o User deleted 

o User invited 

o User invitation accepted 

o User re-invited 

o User email failed 

o User reset requested 

o User reset 

o User credentials created 

o User credentials shared 

o User credentials updated 

o User credentials deleted 

o User API created 

o User API deleted

o Package installed 

o Package updated 

o Package deleted 

o Workflow created 

o Workflow deleted 

o Workflow updated 

∙ AI node logs 

o Memory get messages 

o Memory added message 

o Output parser get instructions 

o Output parser parsed 

o Retriever get relevant documents 

o Embeddings embedded document 

o Embeddings embedded query 

o Document processed 

o Text splitter split 

o Tool called 

o Vector store searched 

o LLM generated 

o Vector store populated 

Destinations 

n8n supports three destination types: 

∙ A syslog server 

∙ A generic webhook 

∙ A Sentry client 

docs-notes.md 

Release notes 

New features and bug fixes for n8n. 

You can also view the Releases{:target=_blank .external-link} in the GitHub repository. –8<– “_snippets/self-hosting/installation/latest-next-version.md” 

–8<– “_snippets/update-n8n.md”

Semantic versioning in n8n 

n8n uses semantic versioning{:target=_blank .external-link}. All version numbers are in the format MAJOR.MINOR.PATCH. Version numbers increment as follows: 

∙ MAJOR version when making incompatible changes which can require user action. ∙ MINOR version when adding functionality in a backward-compatible manner. ∙ PATCH version when making backward-compatible bug fixes. 

/// note | Older versions You can find the release notes for older versions of n8n here /// [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-06-02 This release contains performance improvements and bug fixes. 

Contributors 

maatthc{:target=_blank .external-link} 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-06-02 /// warning | Build failure This release failed to build. Please use 1.97.0 instead. /// 

This release contains API updates, core changes, editor improvements, node updates, and bug fixes. 

Contributors 

matthabermehl{:target=_blank .external-link} 

Stamsy{:target=_blank .external-link} 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-29 This release contains bug fixes. 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-27

/// note | Next version This is the next version. n8n recommends using the latest version. The next version may be unstable. To report issues, use the forum{:target=_blank .external-link}. /// 

This release contains bug fixes. 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-27 

/// note | Latest version This is the latest version. n8n recommends using the latest version. The next version may be unstable. To report issues, use the forum{:target=_blank .external link}. /// 

This release contains bug fixes. 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-26 This release contains core updates, editor improvements, node updates, and bug fixes. Contributors 

Phiph{:target=_blank .external-link} 

cesars-gh{:target=_blank .external-link} 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-19 

This release contains editor improvements, an API update, node updates, new nodes, and bug fixes. 

Verified community nodes on Cloud 

We’ve expanded the n8n ecosystem and unlocked a new level of flexibility for all users including those on n8n Cloud! Now you can access a select set of community nodes and partner integrations without leaving the canvas. This means you install and automate with a wider range of integrations without leaving your workspace. The power of the community is now built-in. 

This update focuses on three major improvements: 

Cloud availability: Community nodes are no longer just for self-hosted users. A select set of nodes is now available on n8n Cloud. 

Built-in discovery: You can find and explore these nodes right from the Nodes panel without leaving the editor or searching on npm.

Trust and verification: Nodes that appear in the editor have been manually vetted for quality and security. These verified nodes are marked with a checkmark. 

We’re starting with a selection of around 25 nodes, including some of the most-used community-built packages and partner-supported integrations. For this phase, we focused on nodes that don’t include external package dependencies – helping streamline the review process and ensure a smooth rollout.  

This is just the start. We plan to expand the library gradually, bringing even more verified nodes into the editor along with the powerful and creative use cases they unlock. In time, our criteria will evolve, opening the door to a wider range of contributions while keeping quality and security in focus.  

Learn more about this update and find out which nodes are already installable from the editor in our blog post. 

💻 Use a verified node 

Make sure you’re on n8n version 1.94.0 or later and the instance Owner has enabled verified community nodes. On Cloud, this can be done from the Admin Panel. For self-hosted instances, please refer to documentation. In both cases, verified nodes are enabled by default. 

∙ Open the Nodes panel from the editor 

∙ Search for the Node. Verified nodes are indicated by a shield 🛡︁ ∙ Select the node and click Install 

Once an Owner installs a node, everyone on the instance can start using it—just drag, drop, and connect like any other node in your workflow. 

🛠︁ Build a node and get it verified 

Want your node to be verified and discoverable from the editor? Here’s how to get involved: 

1. Review the community node verification guidelines. 

2. If you’re building something new, follow the recommendations for creating nodes. 3. Check your design against the UX guidelines. 

4. Submit your node to npm. 

5. Request verification by filling out this form. 

Already built a node? Raise your hand!

If you’ve already published a community node and want it considered for verification, make sure it meets the requirements noted above, then let us know by submitting the interest form. We’re actively curating the next batch and would love to include your work. 

Extended logs view 

When workflows get complex, debugging can get… clicky. That’s where an extended Logs View comes in. Now you can get a clearer path to trace executions, troubleshoot issues, and understand the behavior of a complete workflow — without bouncing between node detail views. 

This update brings a unified, always-accessible panel to the bottom of the canvas, showing you each step of the execution as it happens. Whether you’re working with loops, sub-workflows, or AI agents, you’ll see a structured view of everything that ran, in the order it ran—with input, output, and status info right where you need it. 

You can jump into node details when you want to dig deeper, or follow a single item through every step it touched. Real-time highlighting shows you which nodes are currently running or have failed, and you’ll see total execution time for any workflow—plus token usage for AI workflows to help monitor performance. And if you’re debugging across multiple screens? Just pop the logs out and drag them wherever you’d like. 

⚙︁What it does 

∙ Adds a Logs view to the bottom of the canvas that can be opened or collapsed. (Chat also appears here if your workflow uses it). 

∙ Displays a hierarchical list of nodes in the order they were executed—including expanded views of sub-workflows. 

∙ Allows you to click a node in hierarchy to preview inputs and outputs directly, or jump into the full Node Details view with a link. 

∙ Provides ability to toggle input and output data on and off. 

∙ Highlights each node live as it runs, showing when it starts, completes, or fails. ∙ Includes execution history view to explore past execution data in a similar way. ∙ Shows roll-up stats like total execution time and total AI tokens used (for AI-enabled workflows). 

∙ Includes a “pop out‍ button to open the logs as a floating window—perfect for dragging to another screen while debugging. 

🛠︁How to 

To access the expanded logs view, click on the Logs bar at the bottom of the canvas. The view is also opens up when you open the chat window on the bottom of the page. 

Contributors 

Stamsy{:target=_blank .external-link} 

feelgood-interface{:target=_blank .external-link} 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub.

[email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-12 

This release contains core updates, editor improvements, new nodes, node updates, and bug fixes. 

Faster ways to open sub-workflows 

We’ve added several new ways to navigate your multi-workflow automations faster. From any workflow with a sub-workflow node: 

🖱︁ Right-click on a sub-workflow node and select Open sub-workflow from the context menu 

⌨︁ Keyboard shortcuts 

Windows: CTRL + SHIFT + O or CTRL + Double Click 

Mac: CMD + SHIFT + O or CMD + Double Click 

These options will bring your sub-workflow up in a new tab. 

Archive workflows 

If you’ve ever accidentally removed a workflow, you’ll appreciate the new archiving feature. Instead of permanently deleting workflows with the Remove action, workflows are now archived by default. This allows you to recover them if needed. 

How to: 

Archive a workflow – Select Archive from the Editor UI menu. It has replaced the Remove action. 

Find archived workflows – Archived workflows are hidden by default. To find your archived workflows, select the option for Show archived workflows in the workflow filter menu. 

Permanently delete a workflow – Once a workflow is archived, you can Delete it from the options menu. 

Recover a workflow – Select Unarchive from the options menu. 

Keep in mind: 

∙ Workflows archival requires the same permissions as required previously for removal. ∙ You cannot select archived workflows as sub-workflows to execute 

∙ Active workflows are deactivated when they are archived 

∙ Archived workflows can not be edited

Contributors 

LeaDevelop{:target=_blank .external-link} 

ayhandoslu{:target=_blank .external-link} 

valentina98{:target=_blank .external-link} 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-08 This release contains a bug fix. 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-08 This release contains a bug fix. 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-06 This release contains a bug fix. 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-05 This release contains core updates, editor improvements, node updates, and bug fixes. Partial Execution for AI Tools 

We’ve made it easier to build and iterate on AI agents in n8n. You can now run and test specific tools without having to execute the entire agent workflow. 

Partial execution is especially useful when refining or troubleshooting parts of your agent logic. It allows you to test changes incrementally, without triggering full agent runs, reducing unnecessary AI calls, token usage, and downstream activity. This makes iteration faster, more cost-efficient, and more precise when working with complex or multi-step AI workflows. 

Partial execution for AI tools is available now for all tools – making it even easier to build, test, and fine-tune AI agents in n8n. 

How to: 

To use this feature you can either: 

∙ Click the Play button on the tool you want to execute directly from the canvas view. ∙ Open the tool’s Node Details View and select “Test step” to run it from there. 

If you have previously run the workflow, the input and output will be prefilled with data from the last execution. A pop-up form will open where you can manually fill in the parameters before executing your test. 

Extended logs view 

When workflows get complex, debugging can get… clicky. That’s where an extended Logs View comes in. Now you can get a clearer path to trace executions, troubleshoot issues, and understand the behavior of a complete workflow — without bouncing between node detail views. 

This update brings a unified, always-accessible panel to the bottom of the canvas, showing you each step of the execution as it happens. Whether you’re working with loops, sub-workflows, or AI agents, you’ll see a structured view of everything that ran, in the order it ran—with input, output, and status info right where you need it. 

You can jump into node details when you want to dig deeper, or follow a single item through every step it touched. Real-time highlighting shows you which nodes are currently running or have failed, and you’ll see total execution time for any workflow—plus token usage for AI workflows to help monitor performance. And if you’re debugging across multiple screens? Just pop the logs out and drag them wherever you’d like. 

⚙︁What it does 

∙ Adds a Logs view to the bottom of the canvas that can be opened or collapsed. (Chat also appears here if your workflow uses it). 

∙ Displays a hierarchical list of nodes in the order they were executed—including expanded views of sub-workflows. 

∙ Allows you to click a node in hierarchy to preview inputs and outputs directly, or jump into the full Node Details view with a link. 

∙ Provides ability to toggle input and output data on and off. 

∙ Highlights each node live as it runs, showing when it starts, completes, or fails. ∙ Includes execution history view to explore past execution data in a similar way. ∙ Shows roll-up stats like total execution time and total AI tokens used (for AI-enabled workflows). 

∙ Includes a “pop out‍ button to open the logs as a floating window—perfect for dragging to another screen while debugging. 

🛠︁How to

To access the expanded logs view, click on the Logs bar at the bottom of the canvas. The view is also opens up when you open the chat window on the bottom of the page. 

Insights enhancements for Enterprise 

Two weeks after the launch of Insights, we’re releasing some enhancements designed for enterprise users. 

Expanded time ranges. You can now filter insights over a variety of time periods, from the last 24 hours up to 1 year. Pro users are limited to 7 day and 14 day views. 

Hourly granularity. Drill down into the last 24 hours of production executions with hourly granularity, making it easier to analyze workflows and quickly identify issues. 

These updates provide deeper visibility into workflow history, helping you uncover trends over longer periods and detect problems sooner with more precise reporting. 

Filter insights 

Filter insights 

Filter insights 

Contributors 

Stamsy{:target=_blank .external-link} 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-05 This release contains a bug fix. 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-05 This release contains a bug fix. 

For full release details, refer to Releases{:target=_blank .external-link} on GitHub. [email protected] 

View the commits{:target=_blank .external-link} for this version. Release date: 2025-05-01

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted
Inline Feedbacks
View all comments