← К материалу
Оригинал ↗
SOURCE DOCUMENT
Raw HTML
Build Reliable Workflows With API Idempotency · n8n Blog
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Build Reliable Workflows With API Idempotency – n8n Blog</title>
<meta name="HandheldFriendly" content="True">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,400;0,800;0,900;1,400;1,800;1,900&display=swap">
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,400;0,800;0,900;1,400;1,800;1,900&display=swap"> -->
<link rel="stylesheet" type="text/css" href="https://blog.n8n.io/assets/css/screen.css?v=M18h2_Kr5nq7cywd">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/fontawesome.min.css" crossorigin="anonymous" referrerpolicy="no-referrer">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/solid.min.css" crossorigin="anonymous" referrerpolicy="no-referrer">
<script src="https://blog.n8n.io/assets/js/slugify.js?v=pgb4I6LvVtEl3iCf"></script>
<script src="https://blog.n8n.io/assets/js/workflow-banner.js?v=tSVISzLW2Ja5gfUV"></script>
<script src="https://blog.n8n.io/assets/js/popular-tags.js?v=X0tYuT5LRchLCeSS"></script>
<!-- Google Tag Manager (blog.n8n.io) -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-MQTZKBJ');</script>
<!-- End Google Tag Manager (blog.n8n.io) -->
<meta name="description" content="Learn how API idempotency prevents duplicate operations. Keep workflows reliable and create consistent results with n8n’s built-in idempotency features.">
<link rel="icon" href="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w256h256/2022/06/logo-n8n-symbol-512x512.png" type="image/png">
<link rel="canonical" href="https://blog.n8n.io/idempotency-api/">
<meta name="referrer" content="no-referrer-when-downgrade">
<meta property="og:site_name" content="n8n Blog">
<meta property="og:type" content="article">
<meta property="og:title" content="Build Reliable Workflows With API Idempotency">
<meta property="og:description" content="Learn how API idempotency prevents duplicate operations. Keep workflows reliable and create consistent results with n8n’s built-in idempotency features.">
<meta property="og:url" content="https://blog.n8n.io/idempotency-api/">
<meta property="og:image" content="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w1200/2026/09/TL--16-.jpeg">
<meta property="article:published_time" content="2026-09-03T16:23:44.000Z">
<meta property="article:modified_time" content="2026-09-03T16:23:44.000Z">
<meta property="article:tag" content="Guides">
<meta property="article:tag" content="ITOps">
<meta property="article:publisher" content="https://www.facebook.com/n8nio">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Build Reliable Workflows With API Idempotency">
<meta name="twitter:description" content="Learn how API idempotency prevents duplicate operations. Keep workflows reliable and create consistent results with n8n’s built-in idempotency features.">
<meta name="twitter:url" content="https://blog.n8n.io/idempotency-api/">
<meta name="twitter:image" content="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w1200/2026/09/TL--16-.jpeg">
<meta name="twitter:label1" content="Written by">
<meta name="twitter:data1" content="n8n team">
<meta name="twitter:label2" content="Filed under">
<meta name="twitter:data2" content="Guides, ITOps">
<meta name="twitter:site" content="@n8n_io">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="675">
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"publisher": {
"@type": "Organization",
"name": "n8n Blog",
"url": "https://blog.n8n.io/",
"logo": {
"@type": "ImageObject",
"url": "https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2025/09/n8n-Logo.svg",
"width": 145,
"height": 26
}
},
"author": {
"@type": "Person",
"name": "n8n team",
"image": {
"@type": "ImageObject",
"url": "https://www.gravatar.com/avatar/1eae00944b78b70ae368cb7f7185d8f6?s=250&r=x&d=mp",
"width": 250,
"height": 250
},
"url": "https://blog.n8n.io/author/marketing/",
"sameAs": []
},
"contributor": [
{
"@type": "Person",
"name": "Yulia Dmitrievna",
"image": {
"@type": "ImageObject",
"url": "https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2023/01/profile-pik.jpg"
},
"url": "https://blog.n8n.io/author/yulia/",
"sameAs": []
}
],
"headline": "Build Reliable Workflows With API Idempotency",
"url": "https://blog.n8n.io/idempotency-api/",
"datePublished": "2026-09-03T16:23:44.000Z",
"dateModified": "2026-09-03T16:23:44.000Z",
"image": {
"@type": "ImageObject",
"url": "https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w1200/2026/09/TL--16-.jpeg",
"width": 1200,
"height": 675
},
"keywords": "Guides, ITOps",
"description": "Learn how API idempotency prevents duplicate operations. Keep workflows reliable and create consistent results with n8n’s built-in idempotency features.\n",
"mainEntityOfPage": "https://blog.n8n.io/idempotency-api/"
}
</script>
<meta name="generator" content="Ghost 6.63">
<link rel="alternate" type="application/rss+xml" title="n8n Blog" href="https://blog.n8n.io/rss/">
<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://blog.n8n.io/" data-key="8626993d9b363277120ea42164" data-api="https://n8n-cloud-blog.ghost.io/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script><style id="gh-members-styles">.gh-post-upgrade-cta-content,
.gh-post-upgrade-cta {
display: flex;
flex-direction: column;
align-items: center;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
text-align: center;
width: 100%;
color: #ffffff;
font-size: 16px;
}
.gh-post-upgrade-cta-content {
border-radius: 8px;
padding: 40px 4vw;
}
.gh-post-upgrade-cta h2 {
color: #ffffff;
font-size: 28px;
letter-spacing: -0.2px;
margin: 0;
padding: 0;
}
.gh-post-upgrade-cta p {
margin: 20px 0 0;
padding: 0;
}
.gh-post-upgrade-cta small {
font-size: 16px;
letter-spacing: -0.2px;
}
.gh-post-upgrade-cta a {
color: #ffffff;
cursor: pointer;
font-weight: 500;
box-shadow: none;
text-decoration: underline;
}
.gh-post-upgrade-cta a:hover {
color: #ffffff;
opacity: 0.8;
box-shadow: none;
text-decoration: underline;
}
.gh-post-upgrade-cta a.gh-btn {
display: block;
background: #ffffff;
text-decoration: none;
margin: 28px 0 0;
padding: 8px 18px;
border-radius: 4px;
font-size: 16px;
font-weight: 600;
}
.gh-post-upgrade-cta a.gh-btn:hover {
opacity: 0.92;
}</style>
<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="8626993d9b363277120ea42164" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://n8n-cloud-blog.ghost.io/" data-locale="en" crossorigin="anonymous"></script>
<link href="https://blog.n8n.io/webmentions/receive/" rel="webmention">
<script defer src="/public/cards.min.js?v=H-xYiMJpfVIWffjV"></script>
<link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=yumsKhOGY54VXmGs">
<script defer src="/public/ghost-stats.min.js?v=vFcCUf6ZQ0Hyhc8h" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://blog.n8n.io/.ghost/analytics/api/v1/page_hit" tb_site_uuid="0d78b34c-0c5f-4975-900e-61d00ccb1c2d" tb_post_uuid="5f8e1f4f-3c11-4092-9678-ee49b77edc7c" tb_post_type="post" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script><style>:root {--ghost-accent-color: #FD8925;}</style>
</head>
<body class="post-template tag-guides tag-itops">
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-MQTZKBJ"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<div class="global-wrap">
<div class="global-content">
<div class="hero-background-decoration"></div>
<header class="header-section">
<div class="header-container">
<div class="header-navbar">
<!-- Left Section: Logo + Navigation -->
<div class="header-left">
<div class="header-logo">
<a href="https://blog.n8n.io" class="logo-link">
<img src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2025/09/n8n-Logo.svg" alt="n8n Blog" class="logo-image">
</a>
</div>
<nav class="header-navigation">
<ul class="nav-list">
<li class="nav-item"><a href="https://n8n.io/" class="nav-link">n8n home</a></li>
<li class="nav-item"><a href="/tag/tutorial/" class="nav-link">Tutorials</a></li>
<li class="nav-item"><a href="/tag/guide/" class="nav-link">Guides</a></li>
<li class="nav-item"><a href="/tag/tips/" class="nav-link">Tips</a></li>
<li class="nav-item"><a href="/tag/by-partners/" class="nav-link">By partners</a></li>
<li class="nav-item"><a href="/tag/news/" class="nav-link">News</a></li>
<li class="nav-item"><a href="/tag/interview/" class="nav-link">Interviews</a></li>
</ul>
</nav>
</div>
<!-- Right Section: GitHub Badge + Sign In + Get Started -->
<div class="header-right">
<a href="https://github.com/n8n-io/n8n" class="github-badge" target="_blank" rel="noopener noreferrer">
<div class="github-icon">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 0C5.37 0 0 5.37 0 12C0 17.31 3.435 21.795 8.205 23.385C8.805 23.49 9.03 23.13 9.03 22.815C9.03 22.53 9.015 21.585 9.015 20.58C6 21.135 5.22 19.845 4.98 19.17C4.845 18.825 4.26 17.76 3.75 17.475C3.33 17.25 2.73 16.695 3.735 16.68C4.68 16.665 5.355 17.55 5.58 17.91C6.66 19.725 8.385 19.215 9.075 18.9C9.18 18.12 9.495 17.595 9.84 17.295C7.17 16.995 4.38 15.96 4.38 11.37C4.38 10.065 4.845 8.985 5.61 8.145C5.49 7.845 5.07 6.615 5.73 4.965C5.73 4.965 6.735 4.65 9.03 6.195C9.99 5.925 11.01 5.79 12.03 5.79C13.05 5.79 14.07 5.925 15.03 6.195C17.325 4.635 18.33 4.965 18.33 4.965C18.99 6.615 18.57 7.845 18.45 8.145C19.215 8.985 19.68 10.05 19.68 11.37C19.68 15.975 16.875 16.995 14.205 17.295C14.64 17.67 15.015 18.39 15.015 19.515C15.015 21.12 15 22.41 15 22.815C15 23.13 15.225 23.505 15.825 23.385C18.2072 22.5807 20.2772 21.0497 21.7437 19.0074C23.2101 16.965 23.9993 14.5143 24 12C24 5.37 18.63 0 12 0Z" fill="currentColor"/>
</svg>
</div>
<span class="github-text">Github ★ 162k</span>
</a>
<a href="https://app.n8n.cloud/" class="sign-in-link">Sign in</a>
<a href="https://app.n8n.cloud/register" class="get-started-btn">Get Started</a>
</div>
<!-- Mobile Menu Toggle -->
<div class="mobile-menu-toggle">
<input id="mobile-toggle" class="mobile-checkbox" type="checkbox">
<label class="mobile-toggle-label" for="mobile-toggle">
<span class="hamburger">
<span class="bar"></span>
<span class="bar"></span>
<span class="bar"></span>
</span>
</label>
<!-- Mobile Navigation Menu -->
<nav class="mobile-navigation">
<ul class="mobile-nav-list">
<li class="mobile-nav-item"><a href="https://n8n.io/" class="mobile-nav-link">n8n home</a></li>
<li class="mobile-nav-item"><a href="/tag/tutorial/" class="mobile-nav-link">Tutorials</a></li>
<li class="mobile-nav-item"><a href="/tag/guide/" class="mobile-nav-link">Guides</a></li>
<li class="mobile-nav-item"><a href="/tag/tips/" class="mobile-nav-link">Tips</a></li>
<li class="mobile-nav-item"><a href="/tag/by-partners/" class="mobile-nav-link">By partners</a></li>
<li class="mobile-nav-item"><a href="/tag/news/" class="mobile-nav-link">News</a></li>
<li class="mobile-nav-item"><a href="/tag/interview/" class="mobile-nav-link">Interviews</a></li>
<li class="mobile-nav-item mobile-auth">
<a href="https://app.n8n.cloud/" class="mobile-nav-link">Sign in</a>
<a href="https://app.n8n.cloud/register" class="mobile-get-started-btn">Get Started</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
</header> <main class="global-main">
<progress class="post-progress"></progress>
<!-- Hero Section for Blog Post -->
<div class="post-hero-section">
<div class="post-hero-container">
<div class="post-hero-content">
<div class="post-hero-tags">
<a href="/tag/guides/" class="post-hero-chip">Guides</a>
</div>
<div class="post-hero-copy">
<div class="post-hero-header">
<h1 class="post-hero-title">How To Build Reliable Workflows With API Idempotency</h1>
</div>
<div class="post-hero-subheader">
<p>Learn how API idempotency prevents duplicate operations. Keep workflows reliable and create consistent results with n8n’s built-in idempotency features.
</p>
</div>
</div>
<div class="post-hero-authors">
<div class="post-hero-avatars">
<div class="post-hero-avatar" style="background-image: url(https://www.gravatar.com/avatar/1eae00944b78b70ae368cb7f7185d8f6?s=250&r=x&d=mp)">
</div>
<div class="post-hero-avatar" style="background-image: url(https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2023/01/profile-pik.jpg)">
</div>
</div>
<div class="post-hero-author-info">
<div class="post-hero-author-name">
<a href="/author/marketing/">n8n team</a>, <a href="/author/yulia/">Yulia Dmitrievna</a>
</div>
<div class="post-hero-author-meta">
<time datetime="2026-09-03">September 3, 2026</time> ∙ 6 minutes read
</div>
</div>
</div>
</div>
<div class="post-hero-node-box">
<div class="post-hero-image-wrapper">
<img class="post-hero-image"
srcset="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w400/2026/09/TL--16-.jpeg 400w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/TL--16-.jpeg 600w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w800/2026/09/TL--16-.jpeg 1000w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w1200/2026/09/TL--16-.jpeg 1600w"
sizes="(max-width: 480px) 400px,
(max-width: 768px) 600px,
(max-width: 1024px) 800px,
544px"
src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w800/2026/09/TL--16-.jpeg"
alt="n8n webhook server node routing to multiple workflow nodes on a dark grid background illustrating API idempotency"
loading="eager">
</div>
</div>
</div>
</div>
<!-- Post Content -->
<article class="post-article">
<div class="post-content-wrapper">
<div id="toc"></div>
<div class="post-content">
<p>Retries are a normal part of automation. When an API times out or a network connection drops, workflows often try the request again automatically. But without safeguards, those retries can create duplicate operations instead of safely completing the original request.</p><p>API idempotency is one way to solve that problem. In this guide, we’ll explore the most common patterns for preventing duplicate operations and how to implement them in your workflows.</p><h2 id="why-automated-retries-make-duplication-risk-worse">Why automated retries make duplication risk worse</h2><p>Retries are usually a good thing. If a request times out or a network connection drops, trying again often succeeds without anyone having to intervene. The problem is that workflows can retry automatically, long after a person would have stopped to investigate.</p><p>Imagine a workflow that creates a payment through a third-party API. The payment succeeds, but the response never reaches your workflow because the connection times out. Assuming the request failed, the workflow retries the same API call. If the API can't recognize that it's already processed the request, it creates a second payment instead of returning the original result.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2026/09/idempotency-01--2---1---1-.png" class="kg-image" alt="Diagram comparing manual retry with status check resulting in 1 safe charge versus automated blind retry resulting in duplicate charges" loading="lazy" width="896" height="1000" srcset="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/idempotency-01--2---1---1-.png 600w, https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2026/09/idempotency-01--2---1---1-.png 896w" sizes="(min-width: 720px) 720px"><figcaption><i><em class="italic" style="white-space: pre-wrap;">Without an API idempotency in place, a blind automatic retry would cause double entries.</em></i></figcaption></figure><p>That's why API idempotency matters. In mathematics and computer science, idempotency is what describes an operation that produces the same result no matter how many times it's repeated.</p><p>An idempotent API recognizes repeated requests and produces the same result instead of repeating the underlying operation. That allows workflows to retry without creating duplicate side effects.</p><h2 id="which-http-methods-are-idempotent-by-default">Which HTTP methods are idempotent by default</h2><p>Some HTTP methods are idempotent by definition, while others depend on how your application is designed. Here’s a quick overview:</p>
<!--kg-card-begin: html-->
<div style="position: relative; max-width: 100%; margin-bottom: 1rem;">
<div style="text-align: right; font-size: 12px; color: #888888; margin-bottom: 8px; font-family: sans-serif; letter-spacing: 0.5px;">
Scroll for more ➔
</div>
<div style="overflow-x: auto; -webkit-overflow-scrolling: touch; padding-bottom: 4px;">
<table style="width: 100%; border-collapse: collapse; font-family: sans-serif; font-size: 14px; background-color: #1e1e24; color: #e0e0e0; border-radius: 8px; overflow: hidden; min-width: 600px;">
<thead>
<tr style="background-color: #2d2d3b; text-align: left; text-transform: uppercase; font-size: 12px; letter-spacing: 0.5px;">
<th style="padding: 16px; border-bottom: 1px solid #444; min-width: 100px;">Method</th>
<th style="padding: 16px; border-bottom: 1px solid #444; min-width: 120px;">Idempotent?</th>
<th style="padding: 16px; border-bottom: 1px solid #444;">Why</th>
</tr>
</thead>
<tbody>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 16px; font-weight: bold;">GET</td>
<td style="padding: 16px;">Yes</td>
<td style="padding: 16px;">Retrieves data without changing server state; repeating the request produces the same result</td>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 16px; font-weight: bold;">HEAD</td>
<td style="padding: 16px;">Yes</td>
<td style="padding: 16px;">Returns the same metadata as GET without the response body and doesn't modify server state</td>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 16px; font-weight: bold;">OPTIONS</td>
<td style="padding: 16px;">Yes</td>
<td style="padding: 16px;">Returns the communication options for a resource without causing side effects</td>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 16px; font-weight: bold;">PUT</td>
<td style="padding: 16px;">Yes</td>
<td style="padding: 16px;">Replaces or creates a resource at a specific URI; sending the same request repeatedly leaves the resource in the same state</td>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 16px; font-weight: bold;">DELETE</td>
<td style="padding: 16px;">Yes</td>
<td style="padding: 16px;">Removes a resource; after the first successful request, additional requests don't change the outcome, even if the resource is already gone</td>
</tr>
<tr style="border-bottom: 1px solid #333;">
<td style="padding: 16px; font-weight: bold;">POST</td>
<td style="padding: 16px;">No</td>
<td style="padding: 16px;">Typically creates new resources or triggers actions; repeating the request can create duplicate side effects unless idempotency is implemented</td>
</tr>
<tr>
<td style="padding: 16px; font-weight: bold;">PATCH</td>
<td style="padding: 16px;">No*</td>
<td style="padding: 16px;">Applies partial updates; repeating the request may or may not produce the same result depending on how the update is designed</td>
</tr>
</tbody>
</table>
</div>
<div style="position: absolute; top: 25px; right: 0; bottom: 4px; width: 45px; background: linear-gradient(to right, rgba(30,30,36,0) 0%, rgba(30,30,36,1) 100%); pointer-events: none; border-radius: 0 8px 8px 0;"></div>
</div>
<!--kg-card-end: html-->
<p>Knowing which HTTP methods are safe to retry is a good starting point. The harder challenge is making POST and PATCH requests retry-safe, since they’re the methods most likely to create duplicate operations. That’s where patterns like idempotency keys and request deduplication become essential.</p><h2 id="core-patterns-for-building-idempotent-apis">Core patterns for building idempotent APIs</h2><p>There are multiple ways to make an API idempotent. The right approach depends on what your endpoint does, how it handles state, and where duplicate requests are most likely to occur. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2026/09/idempotency-02--1---1---1-.png" class="kg-image" alt="Sequence diagram showing n8n client sending a POST request with idempotency key, timing out, retrying, and receiving a cached 200 OK response instead of a duplicate charge" loading="lazy" width="768" height="1227" srcset="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/idempotency-02--1---1---1-.png 600w, https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2026/09/idempotency-02--1---1---1-.png 768w" sizes="(min-width: 720px) 720px"><figcaption><i><em class="italic" style="white-space: pre-wrap;">Here’s a schematic example of how idempotency works (first pattern). Each transaction has a unique key. On retry, an API server checks whether a transaction already exists and returns the cached value instead of creating a duplicate record.</em></i></figcaption></figure><p>Here are the most common patterns.</p><h3 id="idempotency-keys">Idempotency keys</h3><p>The client generates a unique idempotency key and sends it with the request, usually in an Idempotency-Key header. The server stores the first successful response associated with that key. If the same request arrives again with the same key, the server returns the original response instead of processing it a second time.</p><h3 id="natural-idempotency">Natural idempotency</h3><p>Some operations are inherently safe to repeat. Updating a user's email address to the same value produces the same final state no matter how many times the request is sent. The same applies to idempotent REST API operations like replacing an entire resource with a PUT request. When possible, designing operations this way reduces the need for additional deduplication logic.</p><h3 id="deduplication-logs">Deduplication logs</h3><p>Instead of relying on the client, the server keeps a record of processed request IDs or event IDs. Before performing any side effects, it checks whether that identifier has already been processed. This approach is especially useful for inbound webhooks and event-driven systems where duplicate deliveries are expected.</p><h3 id="conditional-writes-and-locking">Conditional writes and locking</h3><p>Databases can help enforce idempotency. Unique constraints, optimistic locking, or conditional updates prevent duplicate records from being created, even if multiple identical requests arrive at the same time. This shifts part of the responsibility for idempotency into the persistence layer.</p><h2 id="how-n8n-enforces-idempotency-at-the-orchestration-layer">How n8n enforces idempotency at the orchestration layer</h2><p>The patterns above are universal. But implementing them usually means writing custom retry logic, deduplication checks, and supporting infrastructure. </p><p><a href="https://n8n.io/"><u>n8n</u></a> is a source-available AI workflow automation platform that brings those patterns together at the orchestration layer.</p>
<!--kg-card-begin: html-->
<div class="content-banner">
<div>
<h3>Build workflows that retry safely without creating duplicates</h3>
<p>Deduplication nodes, idempotency keys, and built-in retry logic keep your automations reliable</p>
</div>
<a href="https://app.n8n.cloud/register" class="global-button blog-banner-signup">Sign up for free</a>
</div>
<!--kg-card-end: html-->
<p>Enforcing safe patterns becomes even more important when workflows grow in complexity and interact with more external systems where retries, tools, and long-running executions increase the chances of duplicate actions if idempotency isn't built in.</p><p>Whether you're building API integrations or AI-powered workflows, these n8n features help enforce idempotency in production.</p><h3 id="generate-idempotency-keys-with-executionid">Generate idempotency keys with execution.id</h3><p>One of the simplest ways to make outbound requests retry-safe is to generate a unique idempotency key for each workflow execution. n8n exposes <a href="https://docs.n8n.io/build/code-in-n8n/cookbook/built-in-methods-and-variables-examples/execution"><u>execution.id</u></a> as part of the workflow execution context, giving every run a built-in unique identifier. Pass that value as an Idempotency-Key header in your <a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest"><u>HTTP Request node</u></a>, and retries from the same workflow execution won't be treated as new requests. However, if a workflow is manually retried or re-triggered, it receives a new execution.id. For cross-retry idempotency, generate a key from the input data (e.g., order ID) rather than execution.id. </p><h3 id="retry-requests-safely">Retry requests safely</h3><p>The HTTP Request node includes built-in retry controls that let you <a href="https://docs.n8n.io/integrations/builtin/handle-rate-limits"><u>handle rate limits</u></a>, including Max Tries and Wait Between Tries, to handle temporary failures automatically. Automatic retries are only safe when the endpoint supports idempotency, either through idempotency keys or another deduplication mechanism. Otherwise, every retry risks creating a duplicate operation instead of completing the original request.</p><h3 id="deduplicate-inbound-webhooks">Deduplicate inbound webhooks</h3><p>Idempotency isn't just about outbound requests. If a third-party service delivers the same webhook multiple times, your workflow needs to recognize those duplicates before processing them. A <a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code"><u>Code node</u></a> with custom JavaScript or Python can extract the webhook's delivery ID, check it against the <a href="https://docs.n8n.io/build/work-with-data/data-tables"><u>Data table node</u></a> or a database, and stop the workflow if that ID has already been processed.</p>
<!--kg-card-begin: html-->
<div class="content-banner">
<div>
<h3>Ready to build reliable workflows?</h3>
<p>Import the idempotency gate template and customize it for your stack</p>
</div>
<a href="https://n8n.io/workflows/13863-prevent-duplicate-webhook-executions-with-aari-idempotency-gate/" class="global-button blog-banner-signup">Try this workflow</a>
</div>
<!--kg-card-end: html-->
<h3 id="centralize-failed-executions">Centralize failed executions</h3><p>Retries won't catch every failure. When a workflow still can't complete after exhausting its retries, the <a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.errortrigger"><u>Error Trigger</u></a> node lets you capture the failed execution, log the associated idempotency key, and route it to a retry queue or alert. That gives you a recoverable failure instead of a silent one.</p><h3 id="build-custom-retry-logic">Build custom retry logic</h3><p>Some APIs need longer backoff periods or more retry attempts than the HTTP Request node provides out of the box. In those cases, you can build a custom retry loop with <a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.set"><u>Set</u></a>, <a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if"><u>If</u></a>, and <a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait"><u>Wait</u></a> nodes, giving you full control over retry timing when an endpoint doesn't return a Retry-After header or requires a more conservative backoff strategy.</p><h2 id="common-retry-mistakes-and-how-to-avoid-them">Common retry mistakes and how to avoid them</h2><p>Retries get risky when the workflow doesn’t know what happened on the first attempt. You might try a POST request even though the server already processed it, or accept the same webhook twice and run the entire workflow again.</p><p>Idempotency keys can also cause problems if the same key gets reused for unrelated operations. And if a retry loop has no upper limit, a persistent error could keep consuming executions without ever resolving itself.</p><p>Do this quick retry-safety check before putting a workflow into production:</p><ul><li>Find the POST and PATCH requests in the workflow and check whether those APIs support idempotency keys.</li><li>Keep the same key when retrying an operation; for new operations, use a new key.</li><li>Check webhook event or delivery IDs before processing incoming data.</li><li>Make sure downstream endpoints can handle repeated requests before enabling automatic retries.</li><li>Put a limit on how many times a failed request can retry.</li><li>Keep an eye on execution counts when using custom retry loops so a persistent failure doesn’t eat through your quota.</li></ul><p>If you’re not sure whether a workflow will behave safely when something gets retried, ask the <a href="https://community.n8n.io/"><u>n8n community</u></a> for a second set of eyes.</p><h2 id="build-retry-safe-api-workflows-with-n8n">Build retry-safe API workflows with n8n</h2><p>Idempotency makes API workflows more reliable. Instead of worrying about duplicate payments, webhook deliveries, or failed retries, you can design workflows that recover predictably when requests don't go as planned.</p><p>n8n allows you to do that. You can generate unique execution IDs, configure retry behavior, deduplicate inbound events, and handle failures from a single orchestration layer instead of stitching those capabilities together yourself.</p>
<!--kg-card-begin: html-->
<div class="content-banner">
<div>
<h3>Build retry-safe API workflows with n8n</h3>
<p>Generate unique execution IDs, configure retry behavior, and deduplicate records without custom infrastructure</p>
</div>
<a href="https://app.n8n.cloud/register" class="global-button blog-banner-signup">Try n8n Cloud free</a>
</div>
<!--kg-card-end: html-->
<!-- Share with us section -->
<div class="post-share-section">
<div class="post-share-content">
<h2 class="post-share-title">Share with us</h2>
<div class="post-share-body">
<p>n8n users come from a wide range of backgrounds, experience levels, and interests. We have been looking to highlight different users and their projects in our blog posts. If you're working with n8n and would like to inspire the community, <a href="https://n8n-community.typeform.com/to/VYiRI7WN?ref=blog.n8n.io">contact us</a> 💌</p>
</div>
</div>
<!-- Share buttons -->
<div class="post-share-buttons">
<span class="post-share-label">SHARE</span>
<div class="post-share-icons">
<a href="#" class="post-share-link" onclick="copyToClipboard(window.location.href); return false;">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.293 8.293L7.58604 4.58604C6.80499 3.80499 5.53866 3.80499 4.75761 4.58604C3.97656 5.36709 3.97656 6.63342 4.75761 7.41447L8.46458 11.1214C9.24563 11.9025 10.512 11.9025 11.293 11.1214C12.0741 10.3404 12.0741 9.07405 11.293 8.293Z" stroke="#E8E5EB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M12.707 15.707L16.414 19.414C17.195 20.195 18.4613 20.195 19.2424 19.414C20.0234 18.6329 20.0234 17.3666 19.2424 16.5855L15.5354 12.8786C14.7544 12.0975 13.488 12.0975 12.707 12.8786C11.9259 13.6596 11.9259 14.9259 12.707 15.707Z" stroke="#E8E5EB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M14.8285 9.17145L9.17145 14.8285" stroke="#E8E5EB" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</a>
<a href="https://twitter.com/intent/tweet?text=How%20To%20Build%20Reliable%20Workflows%20With%20API%20Idempotency&url=https://blog.n8n.io/idempotency-api/" target="_blank" rel="noopener" class="post-share-twitter">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M17.75 3.75H20.5L13.93 11.18L21.64 20.25H15.67L10.99 14.32L5.64 20.25H2.89L9.91 12.4L2.5 3.75H8.64L12.87 9.16L17.75 3.75ZM16.49 18.47H18.14L7.74 5.44H5.97L16.49 18.47Z" fill="#E8E5EB"/>
</svg>
</a>
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https://blog.n8n.io/idempotency-api/" target="_blank" rel="noopener" class="post-share-linkedin">
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20.447 20.452H16.893V14.883C16.893 13.555 16.866 11.846 15.041 11.846C13.188 11.846 12.905 13.291 12.905 14.785V20.452H9.351V9H12.765V10.561H12.811C13.288 9.661 14.448 8.711 16.181 8.711C19.782 8.711 20.448 11.081 20.448 14.166V20.452H20.447ZM5.337 7.433C4.193 7.433 3.274 6.507 3.274 5.368C3.274 4.23 4.194 3.305 5.337 3.305C6.477 3.305 7.401 4.23 7.401 5.368C7.401 6.507 6.476 7.433 5.337 7.433ZM7.119 20.452H3.555V9H7.119V20.452ZM22.225 0H1.771C0.792 0 0 0.774 0 1.729V22.271C0 23.227 0.792 24 1.771 24H22.222C23.2 24 24 23.227 24 22.271V1.729C24 0.774 23.2 0 22.222 0H22.225Z" fill="#E8E5EB"/>
</svg>
</a>
</div>
</div>
</div>
</div>
</div>
</article>
<aside class="post-navigation-section">
<div class="post-navigation-wrap">
<a href="/workflow-security/" class="post-navigation-card" aria-label="Workflow Security: Controls for Regulated Industries">
<div class="post-navigation-thumbnail">
<div class="post-navigation-image" style="background-image: url(https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2026/08/TL-4_workflow-security.jpg)"></div>
</div>
<div class="post-navigation-content">
<div class="post-navigation-header">
<h3 class="post-navigation-title">Workflow Security: Controls for Regulated Industries</h3>
</div>
<div class="post-navigation-label">Newer post</div>
</div>
</a>
<a href="/long-running-agents-beyond-prompt-engineering/" class="post-navigation-card" aria-label="Long-running agents beyond prompt engineering">
<div class="post-navigation-thumbnail">
<div class="post-navigation-image" style="background-image: url(https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2026/08/long-running-agents-header.jpg)"></div>
</div>
<div class="post-navigation-content">
<div class="post-navigation-header">
<h3 class="post-navigation-title">Long-running agents beyond prompt engineering</h3>
</div>
<div class="post-navigation-label">Older post</div>
</div>
</a>
</div>
</aside><div class="comments-section">
<div class="comments-wrap">
</div>
</div>
<section class="post-related-section"
data-related-api
data-post-url="https://blog.n8n.io/idempotency-api/"
data-tag-name="Guides"
style="display:none">
<div class="post-related-container">
<div class="post-related-header">
<h2 class="post-related-title">Other guides to get you going</h2>
</div>
<div class="post-related-grid"></div>
</div>
</section>
<section class="post-workflows-section"
data-workflows-api
data-post-url="https://blog.n8n.io/idempotency-api/"
style="display:none">
<div class="post-workflows-container">
<div class="post-workflows-header">
<h2 class="post-workflows-title">Where there's a will, there's already a workflow</h2>
</div>
<div class="post-workflows-grid"></div>
</div>
</section>
<!--<section class="post-latest-section">
<div class="post-latest-container">
<div class="post-latest-header">
<h2 class="post-latest-title">Latest n8n guides</h2>
</div>
<div class="post-latest-grid">
<article class="post-latest-card post tag-guides tag-ai-9">
<a href="/mcp-vs-api/" class="global-link" aria-label="MCP vs. API: Key Differences and When To Use Each"></a>
<div class="post-latest-card-container">
<a href="/mcp-vs-api/" class="post-latest-card-image global-image">
<img srcset="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w400/2026/09/TL--17-.jpeg 400w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/TL--17-.jpeg 600w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w800/2026/09/TL--17-.jpeg 800w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w1200/2026/09/TL--17-.jpeg 1200w"
sizes="(max-width:480px) 350px, 500px"
src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/TL--17-.jpeg"
loading="lazy"
alt="MCP vs. API: Key Differences and When To Use Each">
</a>
<div class="post-latest-card-content">
<div class="post-latest-card-tags global-tags">
<a href="/tag/guides/">Guides</a><a href="/tag/ai-9/">AI</a>
</div>
<div class="post-latest-card-copy">
<h3 class="post-latest-card-title"><a href="/mcp-vs-api/">MCP vs. API: Key Differences and When To Use Each</a></h3>
<div class="post-latest-card-authors global-meta">
<a href="/author/marketing/">n8n team</a>, <a href="/author/yulia/">Yulia Dmitrievna</a>
</div>
</div>
</div>
</div>
</article> <article class="post-latest-card post tag-guides tag-ai-9">
<a href="/autonomous-ai-agents/" class="global-link" aria-label="Autonomous AI Agents: Architecture and Risk Mitigation"></a>
<div class="post-latest-card-container">
<a href="/autonomous-ai-agents/" class="post-latest-card-image global-image">
<img srcset="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w400/2026/09/TL-2_BlogHeader_autonomous-ai-agents--1-.jpg 400w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/TL-2_BlogHeader_autonomous-ai-agents--1-.jpg 600w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w800/2026/09/TL-2_BlogHeader_autonomous-ai-agents--1-.jpg 800w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w1200/2026/09/TL-2_BlogHeader_autonomous-ai-agents--1-.jpg 1200w"
sizes="(max-width:480px) 350px, 500px"
src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/TL-2_BlogHeader_autonomous-ai-agents--1-.jpg"
loading="lazy"
alt="Autonomous AI Agents: Architecture and Risk Mitigation">
</a>
<div class="post-latest-card-content">
<div class="post-latest-card-tags global-tags">
<a href="/tag/guides/">Guides</a><a href="/tag/ai-9/">AI</a>
</div>
<div class="post-latest-card-copy">
<h3 class="post-latest-card-title"><a href="/autonomous-ai-agents/">Autonomous AI Agents: Architecture and Risk Mitigation</a></h3>
<div class="post-latest-card-authors global-meta">
<a href="/author/marketing/">n8n team</a>, <a href="/author/yulia/">Yulia Dmitrievna</a>
</div>
</div>
</div>
</div>
</article> <article class="post-latest-card post">
<a href="/introducing-n8n-assistant/" class="global-link" aria-label="Introducing n8n Assistant"></a>
<div class="post-latest-card-container">
<a href="/introducing-n8n-assistant/" class="post-latest-card-image global-image">
<img srcset="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w400/2026/09/Blog-header---n8n-Assistant-Launch.jpg 400w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/Blog-header---n8n-Assistant-Launch.jpg 600w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w800/2026/09/Blog-header---n8n-Assistant-Launch.jpg 800w,
https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w1200/2026/09/Blog-header---n8n-Assistant-Launch.jpg 1200w"
sizes="(max-width:480px) 350px, 500px"
src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/size/w600/2026/09/Blog-header---n8n-Assistant-Launch.jpg"
loading="lazy"
alt="Introducing n8n Assistant">
</a>
<div class="post-latest-card-content">
<div class="post-latest-card-tags global-tags">
</div>
<div class="post-latest-card-copy">
<h3 class="post-latest-card-title"><a href="/introducing-n8n-assistant/">Introducing n8n Assistant</a></h3>
<div class="post-latest-card-authors global-meta">
<a href="/author/paul/">Paul Gordon, n8n</a>
</div>
</div>
</div>
</div>
</article> </div>
</div>
</section>
-->
<!-- <div class="subscribe-section">
<div class="subscribe-wrap">
<h3>Subscribe to new posts</h3>
<form data-members-form="subscribe" class="subscribe-form">
<input data-members-email type="email" placeholder="Your email address" aria-label="Your email address" required>
<button class="global-button" type="submit">Subscribe</button>
</form>
<div class="subscribe-alert">
<small class="alert-loading global-alert">Processing your application</small>
<small class="alert-success global-alert">Please check your inbox and click the link to confirm your subscription</small>
<small class="alert-error global-alert">There was an error sending the email</small>
</div>
</div>
</div>
-->
</main>
<!-- Mobile Footer (hidden on desktop, shown on mobile) -->
<footer class="footer-mobile">
<div class="footer-mobile-container">
<!-- Logo and Tagline Section -->
<div class="footer-mobile-brand">
<div class="footer-mobile-logo">
<a href="https://blog.n8n.io"><img src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2025/09/n8n-Logo.svg" alt="n8n Blog"></a>
</div>
<p class="footer-mobile-tagline">Automate without limits</p>
<!-- Social Icons -->
<div class="footer-mobile-social">
<a href="https://x.com/n8n_io" aria-label="X (Twitter)"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z"/></svg></a>
<a href="https://github.com/n8n-io/n8n" aria-label="GitHub"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a>
<a href="https://discord.gg/n8n" aria-label="Discord"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.222 0c1.406 0 2.54 1.137 2.607 2.475V24l-2.677-2.273-1.47-1.338-1.604-1.398.67 2.205H3.71c-1.402 0-2.54-1.065-2.54-2.476V2.48C1.17 1.142 2.31.003 3.715.003h16.5L20.222 0zm-6.118 5.683h-.03l-.202.2c2.073.6 3.076 1.537 3.076 1.537-1.336-.668-2.54-1.002-3.744-1.137-.87-.135-1.74-.064-2.475 0h-.2c-.47 0-1.47.2-2.81.735-.467.203-.735.336-.735.336s1.002-1.002 3.21-1.537l-.135-.135s-1.672-.064-3.477 1.27c0 0-1.805 3.144-1.805 7.02 0 0 1 1.74 3.743 1.806 0 0 .4-.533.805-1.002-1.54-.468-2.14-1.404-2.14-1.404s.134.066.335.2h.06c.03 0 .044.015.06.03v.006c.016.016.03.03.06.03.33.136.66.27.93.4.466.202 1.065.403 1.8.536.93.135 1.996.2 3.21 0 .6-.135 1.2-.267 1.8-.535.39-.2.87-.4 1.397-.737 0 0-.6.936-2.205 1.404.33.466.795 1 .795 1 2.744-.06 3.81-1.8 3.87-1.726 0-3.87-1.815-7.02-1.815-7.02-1.635-1.214-3.165-1.26-3.435-1.26l.056-.02zm.168 4.413c.703 0 1.27.6 1.27 1.335 0 .74-.57 1.34-1.27 1.34-.7 0-1.27-.6-1.27-1.334.002-.74.573-1.338 1.27-1.338zm-4.543 0c.7 0 1.266.6 1.266 1.335 0 .74-.57 1.34-1.27 1.34-.7 0-1.27-.6-1.27-1.334 0-.74.57-1.338 1.27-1.338z"/></svg></a>
<a href="https://www.linkedin.com/company/n8n/" aria-label="LinkedIn"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a>
<a href="https://www.youtube.com/c/n8n-io" aria-label="YouTube"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="a" d="M23.495 6.205a3.007 3.007 0 0 0-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 0 0 .527 6.205a31.247 31.247 0 0 0-.522 5.805 31.247 31.247 0 0 0 .522 5.783 3.007 3.007 0 0 0 2.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 0 0 2.088-2.088 31.247 31.247 0 0 0 .5-5.783 31.247 31.247 0 0 0-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg></a>
</div>
</div>
<!-- Primary Links Section -->
<div class="footer-mobile-links">
<div class="footer-mobile-section">
<ul class="footer-mobile-list">
<li><a href="https://n8n.io/careers">Careers</a></li>
<li><a href="https://n8n.io/contact">Contact</a></li>
<li><a href="https://merch.n8n.io/">Merch</a></li>
<li><a href="https://n8n.io/press">Press</a></li>
<li><a href="https://n8n.io/security">Security</a></li>
</ul>
</div>
<!-- Secondary Links Section -->
<div class="footer-mobile-section">
<ul class="footer-mobile-list">
<li><a href="https://n8n.io/case-studies">Case studies</a></li>
<li><a href="https://n8n.io/vs/zapier/">Zapier vs n8n</a></li>
<li><a href="https://n8n.io/vs/make/">Make vs n8n</a></li>
<li><a href="https://n8n.io/workflows/160-convert-xml-to-json/">XML to JSON converter</a></li>
</ul>
</div>
<!-- Tertiary Links Section -->
<div class="footer-mobile-section">
<ul class="footer-mobile-list">
<li><a href="https://n8n.io/affiliates/">Affiliate program</a></li>
<li><a href="https://n8n.io/become-an-expert">Become an expert</a></li>
<li><a href="https://luma.com/n8n-events">Events</a></li>
</ul>
</div>
</div>
<!-- Dropdown Sections -->
<div class="footer-mobile-dropdowns">
<div class="footer-mobile-dropdown">
<button class="footer-dropdown-toggle" data-dropdown="popular-integrations">
<span>Popular integrations</span>
<svg class="dropdown-chevron" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M5 7.5L10 12.5L15 7.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div class="footer-dropdown-content" id="popular-integrations">
<ul>
<li><a href="https://n8n.io/integrations/google-sheets">Google Sheets</a></li>
<li><a href="https://n8n.io/integrations/telegram">Telegram</a></li>
<li><a href="https://n8n.io/integrations/mysql">MySQL</a></li>
<li><a href="https://n8n.io/integrations/slack">Slack</a></li>
<li><a href="https://n8n.io/integrations/discord">Discord</a></li>
<li><a href="https://n8n.io/integrations/postgres">PostgreSQL</a></li>
</ul>
<a href="https://n8n.io/integrations" class="footer-show-more">Show more</a>
</div>
</div>
<div class="footer-mobile-dropdown">
<button class="footer-dropdown-toggle" data-dropdown="trending-combinations">
<span>Trending combinations</span>
<svg class="dropdown-chevron" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M5 7.5L10 12.5L15 7.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div class="footer-dropdown-content" id="trending-combinations">
<ul>
<li><a href="https://n8n.io/workflows">Google Sheets + Slack</a></li>
<li><a href="https://n8n.io/workflows">Discord + MySQL</a></li>
<li><a href="https://n8n.io/workflows">Telegram + PostgreSQL</a></li>
</ul>
<a href="https://n8n.io/workflows" class="footer-show-more">Show more</a>
</div>
</div>
<div class="footer-mobile-dropdown">
<button class="footer-dropdown-toggle" data-dropdown="technical-teams">
<span>Used by technical teams</span>
<svg class="dropdown-chevron" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M5 7.5L10 12.5L15 7.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div class="footer-dropdown-content" id="technical-teams">
<ul>
<li><a href="https://n8n.io/use-cases/development">Development Teams</a></li>
<li><a href="https://n8n.io/use-cases/devops">DevOps</a></li>
<li><a href="https://n8n.io/use-cases/infrastructure">Infrastructure</a></li>
</ul>
<a href="https://n8n.io/use-cases" class="footer-show-more">Show more</a>
</div>
</div>
<div class="footer-mobile-dropdown">
<button class="footer-dropdown-toggle" data-dropdown="integration-categories">
<span>Top integration categories</span>
<svg class="dropdown-chevron" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M5 7.5L10 12.5L15 7.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div class="footer-dropdown-content" id="integration-categories">
<ul>
<li><a href="https://n8n.io/integrations/databases">Databases</a></li>
<li><a href="https://n8n.io/integrations/communication">Communication</a></li>
<li><a href="https://n8n.io/integrations/productivity">Productivity</a></li>
</ul>
<a href="https://n8n.io/integrations" class="footer-show-more">Show more</a>
</div>
</div>
<div class="footer-mobile-dropdown">
<button class="footer-dropdown-toggle" data-dropdown="trending-templates">
<span>Trending templates</span>
<svg class="dropdown-chevron" width="20" height="20" viewBox="0 0 20 20" fill="none">
<path d="M5 7.5L10 12.5L15 7.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
<div class="footer-dropdown-content" id="trending-templates">
<ul>
<li><a href="https://n8n.io/workflows">Automated Data Sync</a></li>
<li><a href="https://n8n.io/workflows">Lead Generation</a></li>
<li><a href="https://n8n.io/workflows">Customer Support</a></li>
</ul>
<a href="https://n8n.io/workflows" class="footer-show-more">Show more</a>
</div>
</div>
</div>
<!-- Legal Links and Copyright -->
<div class="footer-mobile-bottom">
<div class="footer-mobile-legal">
<a href="https://n8n.io/imprint/">Imprint</a>
<span class="footer-separator">|</span>
<a href="https://n8n.io/legal/security/">Security</a>
<span class="footer-separator">|</span>
<a href="https://n8n.io/legal/privacy/">Privacy</a>
<span class="footer-separator">|</span>
<a href="https://n8n.io/legal/vulnerability-disclosure-policy/">Report a vulnerability</a>
</div>
<div class="footer-mobile-copyright">
<p>© 2026 n8n | All rights reserved.</p>
</div>
</div>
</div>
</footer>
<!-- Desktop Footer (shown on desktop, hidden on mobile) -->
<footer class="blog-footer footer-desktop">
<div class="blog-footer-container">
<!-- Logo and Social Section -->
<div class="footer-brand">
<div class="footer-brand-left">
<div class="footer-logo">
<a href="https://blog.n8n.io"><img src="https://storage.ghost.io/c/0d/78/0d78b34c-0c5f-4975-900e-61d00ccb1c2d/content/images/2025/09/n8n-Logo.svg" alt="n8n Blog"></a>
</div>
<p class="footer-tagline">Automate without limits</p>
<div class="footer-social">
<a href="https://x.com/n8n_io" aria-label="X (Twitter)"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z"/></svg></a>
<a href="https://github.com/n8n-io/n8n" aria-label="GitHub"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg></a>
<a href="https://discord.gg/n8n" aria-label="Discord"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.222 0c1.406 0 2.54 1.137 2.607 2.475V24l-2.677-2.273-1.47-1.338-1.604-1.398.67 2.205H3.71c-1.402 0-2.54-1.065-2.54-2.476V2.48C1.17 1.142 2.31.003 3.715.003h16.5L20.222 0zm-6.118 5.683h-.03l-.202.2c2.073.6 3.076 1.537 3.076 1.537-1.336-.668-2.54-1.002-3.744-1.137-.87-.135-1.74-.064-2.475 0h-.2c-.47 0-1.47.2-2.81.735-.467.203-.735.336-.735.336s1.002-1.002 3.21-1.537l-.135-.135s-1.672-.064-3.477 1.27c0 0-1.805 3.144-1.805 7.02 0 0 1 1.74 3.743 1.806 0 0 .4-.533.805-1.002-1.54-.468-2.14-1.404-2.14-1.404s.134.066.335.2h.06c.03 0 .044.015.06.03v.006c.016.016.03.03.06.03.33.136.66.27.93.4.466.202 1.065.403 1.8.536.93.135 1.996.2 3.21 0 .6-.135 1.2-.267 1.8-.535.39-.2.87-.4 1.397-.737 0 0-.6.936-2.205 1.404.33.466.795 1 .795 1 2.744-.06 3.81-1.8 3.87-1.726 0-3.87-1.815-7.02-1.815-7.02-1.635-1.214-3.165-1.26-3.435-1.26l.056-.02zm.168 4.413c.703 0 1.27.6 1.27 1.335 0 .74-.57 1.34-1.27 1.34-.7 0-1.27-.6-1.27-1.334.002-.74.573-1.338 1.27-1.338zm-4.543 0c.7 0 1.266.6 1.266 1.335 0 .74-.57 1.34-1.27 1.34-.7 0-1.27-.6-1.27-1.334 0-.74.57-1.338 1.27-1.338z"/></svg></a>
<a href="https://www.linkedin.com/company/n8n/" aria-label="LinkedIn"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a>
<a href="https://www.youtube.com/c/n8n-io" aria-label="YouTube"><svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path class="a" d="M23.495 6.205a3.007 3.007 0 0 0-2.088-2.088c-1.87-.501-9.396-.501-9.396-.501s-7.507-.01-9.396.501A3.007 3.007 0 0 0 .527 6.205a31.247 31.247 0 0 0-.522 5.805 31.247 31.247 0 0 0 .522 5.783 3.007 3.007 0 0 0 2.088 2.088c1.868.502 9.396.502 9.396.502s7.506 0 9.396-.502a3.007 3.007 0 0 0 2.088-2.088 31.247 31.247 0 0 0 .5-5.783 31.247 31.247 0 0 0-.5-5.805zM9.609 15.601V8.408l6.264 3.602z"/></svg></a>
</div>
</div>
<div class="footer-brand-right">
<ul class="footer-primary-links">
<li><a href="https://n8n.io/">n8n home</a></li>
<li><a href="https://n8n.io/features/">Features</a></li>
<li><a href="https://n8n.io/pricing/">Pricing</a></li>
<li><a href="https://docs.n8n.io/">Docs</a></li>
<li><a href="https://community.n8n.io/">Community</a></li>
</ul>
</div>
</div>
<!-- Bottom Section -->
<div class="footer-bottom">
<div class="footer-legal">
<a href="https://n8n.io/imprint/">Imprint</a>
<span class="footer-separator">|</span>
<a href="https://n8n.io/legal/security/">Security</a>
<span class="footer-separator">|</span>
<a href="https://n8n.io/legal/privacy/">Privacy</a>
<span class="footer-separator">|</span>
<a href="https://n8n.io/legal/vulnerability-disclosure-policy/">Report a vulnerability</a>
</div>
<div class="footer-copyright">
<p>© 2026 n8n | All rights reserved.</p>
</div>
</div>
</div>
</footer>
</div>
</div>
<div id="notifications" class="global-notification">
<div class="subscribe">You’ve successfully subscribed to n8n Blog</div>
<div class="signin">Welcome back! You’ve successfully signed in.</div>
<div class="signup">Great! You’ve successfully signed up.</div>
<div class="expired">Your link has expired</div>
<div class="checkout-success">Success! Check your email for magic link to sign-in.</div>
</div>
<script src="https://blog.n8n.io/assets/js/global.js?v=Wrm8OemR0lUQ9qP5"></script>
<script src="https://blog.n8n.io/assets/js/post.js?v=mR1N_JBqRdiTUgjo"></script>
<script src="https://blog.n8n.io/assets/js/toc.js?v=oPtDPMixJsjbTkh9"></script>
<script>
!function(){"use strict";const p=new URLSearchParams(window.location.search),isAction=p.has("action"),isStripe=p.has("stripe"),success=p.get("success"),action=p.get("action"),stripe=p.get("stripe"),n=document.getElementById("notifications"),a="is-subscribe",b="is-signin",c="is-signup",d="is-expired",e="is-checkout-success";
function hideNotification() {
n.classList.remove(a,b,c,d,e);
window.history.replaceState(null,null,window.location.pathname);
}
if(p&&(isAction||isStripe)) {
if(isAction) {
if(action=="subscribe"&&success=="true") n.classList.add(a);
if(action=="signin"&&success=="true") n.classList.add(b);
if(action=="signup"&&success=="true") n.classList.add(c);
if(success=="false") n.classList.add(d);
}
if(isStripe&&stripe=="success") n.classList.add(e);
// Auto hide after 5 seconds
setTimeout(hideNotification, 5000);
// Click to close
n.addEventListener('click', hideNotification);
}}();
</script>
<script src="https://blog.n8n.io/assets/js/external-links.js?v=DikCkQ8Bvh7jO-3I"></script>
</body>
</html>