[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-n8n-n8n-loops-official":3,"mdc-flzpg2-key":33,"related-repo-n8n-n8n-loops-official":1686,"related-org-n8n-n8n-loops-official":1791},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"n8n-loops-official","process multi-item data in n8n workflows","Use when working with multi-item data, batches, paginated APIs, rate-limited APIs, fan-out across multiple branches, anything that needs to \"do this for each\", or any time the user mentions looping, iterating, batching, paging, parallelism, or \"loop over items\". Triggers on \"loop\", \"iterate\", \"for each\", \"batch\", \"page through\", \"paginate\", \"rate limit\", \"process all\", \"fan-out\", \"parallel branches\", \"concurrency\", or any node that should run once vs once-per-item.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},"n8n","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fn8n.png","n8n-io",[12,14,17,20],{"name":8,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Automation","automation",{"name":18,"slug":19,"type":13},"Data Pipeline","data-pipeline",{"name":21,"slug":22,"type":13},"Workflow Automation","workflow-automation",319,"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fskills","2026-07-08T05:44:46.411605",null,30,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fn8n-loops-official","---\nname: n8n-loops-official\ndescription: Use when working with multi-item data, batches, paginated APIs, rate-limited APIs, fan-out across multiple branches, anything that needs to \"do this for each\", or any time the user mentions looping, iterating, batching, paging, parallelism, or \"loop over items\". Triggers on \"loop\", \"iterate\", \"for each\", \"batch\", \"page through\", \"paginate\", \"rate limit\", \"process all\", \"fan-out\", \"parallel branches\", \"concurrency\", or any node that should run once vs once-per-item.\n---\n\n# n8n Loops\n\nThree meanings of \"loop\" map to three mechanisms:\n\n1. **\"Run this node for every item.\"** Default. Most nodes loop automatically, so do nothing.\n2. **\"Run this node *once* with all items, not once per item.\"** The `executeOnce` setting (single boolean).\n3. **\"Process items in explicit batches with control flow between iterations.\"** The `Loop Over Items` node (formerly `Split In Batches`).\n\nFor paginated APIs, the HTTP Request node has built-in pagination. Almost always preferable to a hand-built page-counting loop.\n\n## The model: items are an array\n\nData flows between nodes as an array of items, each `{ json: {...}, binary?: {...} }`. 50 items = 50-entry array.\n\nDefault: a node runs once *per item*. An HTTP Request with 50 input items fires 50 requests and outputs 50 result items. This is the implicit loop most workflows rely on.\n\n**The input array is the loop.** Control iteration by controlling the array.\n\n## Non-negotiable\n\n**`executeOnce: true` whenever a node should fire once-per-run, not once-per-item.** Includes any expression *aggregating across the dataset* via `$input.all()` \u002F `$('Node').all()` plus `.map()` \u002F `.filter()` \u002F `.reduce()` (without it, the aggregate computes N times for N upstream items, often producing N duplicates downstream). Also includes single notifications, aggregate writes, summary messages.\n\n**Counter-case:** `.all()` combined with another node's `.item` (a per-item lookup, e.g., `$('Get Tags').all().filter(tag => $('Search Posts').item.json.tag_ids.includes(tag.json.id))`) is real per-item work and should keep `executeOnce` off. See the `n8n-expressions-official` skill's executeOnce section for the full distinction.\n\n## Strong defaults\n\n- **Don't build a loop when default iteration suffices.** Most nodes (HTTP Request, native service nodes, Set, IF\u002FSwitch) run once per input item automatically: N items in, N runs. To make N HTTP calls or create N records, just connect the source to the node. Don't reach for `Loop Over Items` unless you need per-iteration control. (Note: `Execute Workflow` is the exception. It defaults to a single all-items batch. See `n8n-subworkflows-official` for `mode: 'each'`.)\n- **For paginated APIs, use HTTP Request's built-in pagination.** Don't reinvent with `Loop Over Items` + manual `$pageCount` unless the API is genuinely odd. See `references\u002FHTTP_PAGINATION.md`.\n- **`Loop Over Items` is for explicit batching or per-iteration control** (rate limiting, per-batch error recovery, stateful chunks, polling). See `references\u002FLOOP_OVER_ITEMS.md`.\n- **Per-item iteration is sequential, not parallel.** Each item completes before the next starts, even on parallel _looking_ branches. For a real concurrency pattern, see `n8n-subworkflows-official`. \n\n## Decision tree: which mechanism do I need?\n\n```\nNeed to do something for each item?\n├── Default per-item iteration is enough\n│   └── Just connect the node. Done.\n│\n├── The node should run once total, not once per item?\n│   └── Set executeOnce: true on the node\n│\n├── Paginated API (multiple HTTP calls to fetch all pages)?\n│   └── Use HTTP Request's Pagination option (see references\u002FHTTP_PAGINATION.md)\n│\n├── Need explicit batching (rate limit, chunk size, per-batch error handling)?\n│   └── Use Loop Over Items node (see references\u002FLOOP_OVER_ITEMS.md)\n│\n└── Need to recurse \u002F repeat with state until a condition is met?\n    └── Loop Over Items with Reset, OR a sub-workflow that calls itself.\n        Both are advanced patterns; see references\u002FLOOP_OVER_ITEMS.md.\n```\n\n## `executeOnce`: the single-fire setting\n\nEvery node's Settings tab has an **Execute Once** toggle. When on, the node runs once using only the first input item. In SDK code, set `executeOnce: true` as shown; on an existing workflow, apply it via `update_workflow` `setNodeSettings` (n8n 2.24.0+).\n\n```ts\n{\n    name: 'Aggregate Slack',\n    type: 'n8n-nodes-base.slack',\n    parameters: { \u002F* ... *\u002F },\n    executeOnce: true,\n}\n```\n\nWhen to use it:\n\n- **Notifications and aggregate writes.** A \"summary message\" shouldn't fire 100 times because 100 items came in.\n- **Counters, totals, reports.** Anything computing `$input.all().length` etc. should run once.\n- **Expressions aggregating across the full array via `$input.all()` \u002F `$('Node').all()`.** Otherwise the aggregate runs per upstream item. (Per-item *lookups* using `.all()` filtered by another node's `.item` are the counter-case, see `n8n-expressions-official`.)\n\nWhen NOT to use it:\n\n- **Per-item operations.** One notification *per* item is the default and usually correct.\n- **HTTP requests fanning out per item.** You want one call per item.\n\nMost common mistake: forgetting `executeOnce` on an aggregate node, then seeing the same message fire 50 times after a fan-out.\n\n## When the implicit loop bites you\n\nDefault per-item iteration is great until it isn't. Common surprises:\n\n### A \"single\" config node fires per item\n\nA `Set` node after a fan-out runs once per item, producing N copies of the same constants. Usually fine, but expensive expressions (long `JSON.stringify`, Luxon parse) run N times. Move the Set above the fan-out, or set `executeOnce: true`.\n\n### An aggregate Code node runs N times\n\nA Code node reading `$input.all()` to compute a sum runs once per upstream item without `executeOnce: true`, producing N identical items. Set `executeOnce: true`.\n\n### A respond-to-webhook fires twice\n\nMost painful version. Respond-to-Webhook fires per input item, and two branches converging without a merge fire it twice: first response wins, the rest log errors. Merge first, or ensure only one branch reaches the responder. See `n8n-node-configuration-official` `references\u002FMERGE_NODE.md`.\n\n### An LLM call fires N times when you wanted one summary\n\nSame shape as the aggregate Code node. An LLM node with `$input.all()` in its prompt makes N identical calls, costs N tokens, returns N identical answers without `executeOnce: true`.\n\n## When to reach for `Loop Over Items`\n\nDefault iteration handles most cases. Use `Loop Over Items` for:\n\n- **Rate limiting.** \"Process 10 at a time, 1s wait between batches.\"\n- **Batched API calls with array bodies.** \"Send 50-item chunks to \u002Fbulk.\"\n- **Per-batch error handling.** \"If a batch fails, log and continue.\"\n- **Stateful iteration.** \"Each iteration depends on the previous output.\"\n- **Polling a long-running job.** \"Start, check status every 30s until done or capped.\" Uses `reset: true` plus a `$runIndex` ceiling.\n- **Per-item multi-branch with aggregation.** \"For each input, run transforms in parallel, merge, then aggregate.\" The done output (index 0) carries the result.\n\nFor wiring details, the output-index gotcha (output 0 = **done**, output 1 = **loop**), and worked examples, see `references\u002FLOOP_OVER_ITEMS.md`.\n\n## When NOT to reach for `Loop Over Items`\n\nThe most common rationalization: \"I need to wait for all items to finish before the next step, so I'll add Loop Over Items and use the `done` output.\" **You don't need Loop Over Items for that.** Default per-item iteration already waits: each item flows through the full downstream chain before the next item starts, and the post-loop node never fires \"early.\"\n\nThe cure for that mistake is almost always: **delete the Loop Over Items node, change nothing else, ship**. That is Scenario 1 below, and it covers the majority of cases.\n\nThe four scenarios are independent. Read them as separate decisions, not as alternatives that all \"replace\" Loop Over Items. Most builds hit Scenario 1 and are done. Scenarios 2 and 3 only enter the picture when their specific goal applies. Scenario 4 is the narrow case where Loop Over Items actually earns its place.\n\n### Scenario 1: default per-item iteration (the default, most common)\n\nSource emits N items, per-item processor runs N times, downstream chain follows. **No Loop Over Items, no `executeOnce`, no Aggregate.** Just connect the nodes.\n\n```\n[Source: 20 items]\n  → [Per-item processor]   # default iter, runs 20 times\n  → [Next step]            # runs after each item, in order\n```\n\nIf a `Loop Over Items + done` was added here \"to wait for all items\" or \"to make the next node run for each item,\" delete the Loop Over Items node and wire source straight to processor. **Do not replace it with anything.** Default iteration already does the job. The exception is `Execute Workflow` (sub-workflow): it defaults to a single all-items batch, so per-item invocation needs `mode: 'each'` on that node, not a Loop. See `n8n-subworkflows-official`.\n\n### Scenario 2: a downstream node should fire once total (`executeOnce: true`)\n\nIndependent of Scenario 1. Triggered only when there is a SPECIFIC downstream node whose job is once-per-run, not once-per-item: one digest email after 20 papers process, one summary write after the loop, one final Slack notification.\n\nSet `executeOnce: true` on that node. The node receives all upstream items but runs once. This is a per-node setting, not a Loop replacement: the per-item processor in Scenario 1 still runs N times, and only this one downstream node collapses.\n\n### Scenario 3: a node needs the items as a single array (Aggregate)\n\nIndependent of Scenario 1. Triggered only when a downstream node's input contract is a list, not per-item invocations (e.g., a node taking a JSON array body, an LLM prompt that needs the whole list).\n\nUse the Aggregate node to collapse the per-item stream into one item containing the array. Again, not a Loop replacement.\n\n### Scenario 4: genuine batching (the only time Loop Over Items earns its place)\n\nRate limiting (process N at a time with a Wait between batches), chunked bulk API calls (POST 50-item arrays to `\u002Fbulk`), per-batch error handling, polling a long-running job with `reset: true` and a `$runIndex` ceiling, stateful iteration where each batch depends on the previous output.\n\n\"Wait for items to finish\" does not qualify. Default iteration already does that.\n\n### Quick disambiguation\n\nIf your only reason for the Loop is \"wait for items \u002F run for each item,\" you are in Scenario 1. Delete the Loop. Do not add `executeOnce` or Aggregate as a substitute. They solve different problems and are only added when their own scenario applies.\n\n## When to reach for HTTP pagination\n\nThree common page shapes:\n\n- **Next-URL in response.** Each response includes a `next` link.\n- **Page number\u002Fcursor parameter.** Bump `?page=N` or `?cursor=...` each call.\n- **Stop on empty page** or specific status.\n\nHTTP Request handles all natively via its **Pagination** option: set the mode, give a next-page expression, and the node loops internally, returning a single output array of all pages' items.\n\nDon't reinvent with `Loop Over Items` + manual `$pageCount` unless the API does something the built-in modes can't express.\n\nSee `references\u002FHTTP_PAGINATION.md`.\n\n## Sub-workflow recursion\n\nFor genuinely recursive work (tree walking, retry-with-backoff, \"process this and its children\"), a self-calling sub-workflow is cleaner than `Loop Over Items` with `Reset`. Input parameters carry recursion state.\n\n```\nSub-workflow: Walk Tree\n  inputs: { node_id, depth }\n  body: process node, look up children, for each child call self with depth+1\n```\n\nWatch recursion depth. n8n has nested-execution limits. For deep recursion, a queue + flat loop beats true recursion.\n\n## Reference files\n\n| File | Read when |\n|---|---|\n| `references\u002FLOOP_OVER_ITEMS.md` | Configuring the Loop Over Items node, batching, rate limiting, stateful iteration |\n| `references\u002FHTTP_PAGINATION.md` | Calling a paginated API, configuring HTTP Request pagination modes |\n\n## Anti-patterns\n\n| Anti-pattern | What goes wrong | Fix |\n|---|---|---|\n| Adding `Loop Over Items` to \"make it loop\" when default iteration already does | Workflow harder to read for no benefit, and loop output vs done output gets miswired | Just connect the node directly and let default iteration handle it |\n| Aggregate Code node without `executeOnce` | Same aggregate computed N times, output has N identical items | Set `executeOnce: true` |\n| Manual pagination loop with `Loop Over Items` + `$pageCount` | Reinvents what HTTP Request does natively, with brittle stop conditions | Use HTTP Request's `Pagination` option |\n| Sending one Slack message per item when you wanted a summary | Slack channel floods, rate limits hit, embarrassment | `executeOnce: true` on the Slack node, build the summary upstream |\n| Two branches both reach `Respond to Webhook` | Responds twice, downstream callers see errors | Merge before the responder, or ensure only one branch reaches it |\n| `Loop Over Items` with `Reset` and no clear termination | Infinite loop, n8n eats memory until the execution is killed | Always have a clear termination condition. Prefer HTTP pagination for paged APIs |\n| Nesting one `Loop Over Items` inside another in the same workflow | Broken at runtime, validation passes | Move the inner loop into a sub-workflow called per outer iteration. See `n8n-subworkflows-official` `mode: 'each'` |\n\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,47,53,121,126,133,146,158,168,174,235,284,290,413,419,431,442,476,624,629,709,714,744,756,762,767,774,801,807,832,838,857,863,881,892,904,983,1008,1019,1038,1050,1055,1061,1080,1089,1129,1142,1147,1159,1165,1170,1175,1181,1208,1213,1219,1231,1237,1242,1299,1311,1329,1340,1346,1366,1375,1380,1386,1446,1452,1680],{"type":39,"tag":40,"props":41,"children":43},"element","h1",{"id":42},"n8n-loops",[44],{"type":45,"value":46},"text","n8n Loops",{"type":39,"tag":48,"props":49,"children":50},"p",{},[51],{"type":45,"value":52},"Three meanings of \"loop\" map to three mechanisms:",{"type":39,"tag":54,"props":55,"children":56},"ol",{},[57,69,96],{"type":39,"tag":58,"props":59,"children":60},"li",{},[61,67],{"type":39,"tag":62,"props":63,"children":64},"strong",{},[65],{"type":45,"value":66},"\"Run this node for every item.\"",{"type":45,"value":68}," Default. Most nodes loop automatically, so do nothing.",{"type":39,"tag":58,"props":70,"children":71},{},[72,85,87,94],{"type":39,"tag":62,"props":73,"children":74},{},[75,77,83],{"type":45,"value":76},"\"Run this node ",{"type":39,"tag":78,"props":79,"children":80},"em",{},[81],{"type":45,"value":82},"once",{"type":45,"value":84}," with all items, not once per item.\"",{"type":45,"value":86}," The ",{"type":39,"tag":88,"props":89,"children":91},"code",{"className":90},[],[92],{"type":45,"value":93},"executeOnce",{"type":45,"value":95}," setting (single boolean).",{"type":39,"tag":58,"props":97,"children":98},{},[99,104,105,111,113,119],{"type":39,"tag":62,"props":100,"children":101},{},[102],{"type":45,"value":103},"\"Process items in explicit batches with control flow between iterations.\"",{"type":45,"value":86},{"type":39,"tag":88,"props":106,"children":108},{"className":107},[],[109],{"type":45,"value":110},"Loop Over Items",{"type":45,"value":112}," node (formerly ",{"type":39,"tag":88,"props":114,"children":116},{"className":115},[],[117],{"type":45,"value":118},"Split In Batches",{"type":45,"value":120},").",{"type":39,"tag":48,"props":122,"children":123},{},[124],{"type":45,"value":125},"For paginated APIs, the HTTP Request node has built-in pagination. Almost always preferable to a hand-built page-counting loop.",{"type":39,"tag":127,"props":128,"children":130},"h2",{"id":129},"the-model-items-are-an-array",[131],{"type":45,"value":132},"The model: items are an array",{"type":39,"tag":48,"props":134,"children":135},{},[136,138,144],{"type":45,"value":137},"Data flows between nodes as an array of items, each ",{"type":39,"tag":88,"props":139,"children":141},{"className":140},[],[142],{"type":45,"value":143},"{ json: {...}, binary?: {...} }",{"type":45,"value":145},". 50 items = 50-entry array.",{"type":39,"tag":48,"props":147,"children":148},{},[149,151,156],{"type":45,"value":150},"Default: a node runs once ",{"type":39,"tag":78,"props":152,"children":153},{},[154],{"type":45,"value":155},"per item",{"type":45,"value":157},". An HTTP Request with 50 input items fires 50 requests and outputs 50 result items. This is the implicit loop most workflows rely on.",{"type":39,"tag":48,"props":159,"children":160},{},[161,166],{"type":39,"tag":62,"props":162,"children":163},{},[164],{"type":45,"value":165},"The input array is the loop.",{"type":45,"value":167}," Control iteration by controlling the array.",{"type":39,"tag":127,"props":169,"children":171},{"id":170},"non-negotiable",[172],{"type":45,"value":173},"Non-negotiable",{"type":39,"tag":48,"props":175,"children":176},{},[177,188,190,195,197,203,205,211,213,219,220,226,227,233],{"type":39,"tag":62,"props":178,"children":179},{},[180,186],{"type":39,"tag":88,"props":181,"children":183},{"className":182},[],[184],{"type":45,"value":185},"executeOnce: true",{"type":45,"value":187}," whenever a node should fire once-per-run, not once-per-item.",{"type":45,"value":189}," Includes any expression ",{"type":39,"tag":78,"props":191,"children":192},{},[193],{"type":45,"value":194},"aggregating across the dataset",{"type":45,"value":196}," via ",{"type":39,"tag":88,"props":198,"children":200},{"className":199},[],[201],{"type":45,"value":202},"$input.all()",{"type":45,"value":204}," \u002F ",{"type":39,"tag":88,"props":206,"children":208},{"className":207},[],[209],{"type":45,"value":210},"$('Node').all()",{"type":45,"value":212}," plus ",{"type":39,"tag":88,"props":214,"children":216},{"className":215},[],[217],{"type":45,"value":218},".map()",{"type":45,"value":204},{"type":39,"tag":88,"props":221,"children":223},{"className":222},[],[224],{"type":45,"value":225},".filter()",{"type":45,"value":204},{"type":39,"tag":88,"props":228,"children":230},{"className":229},[],[231],{"type":45,"value":232},".reduce()",{"type":45,"value":234}," (without it, the aggregate computes N times for N upstream items, often producing N duplicates downstream). Also includes single notifications, aggregate writes, summary messages.",{"type":39,"tag":48,"props":236,"children":237},{},[238,243,245,251,253,259,261,267,269,274,276,282],{"type":39,"tag":62,"props":239,"children":240},{},[241],{"type":45,"value":242},"Counter-case:",{"type":45,"value":244}," ",{"type":39,"tag":88,"props":246,"children":248},{"className":247},[],[249],{"type":45,"value":250},".all()",{"type":45,"value":252}," combined with another node's ",{"type":39,"tag":88,"props":254,"children":256},{"className":255},[],[257],{"type":45,"value":258},".item",{"type":45,"value":260}," (a per-item lookup, e.g., ",{"type":39,"tag":88,"props":262,"children":264},{"className":263},[],[265],{"type":45,"value":266},"$('Get Tags').all().filter(tag => $('Search Posts').item.json.tag_ids.includes(tag.json.id))",{"type":45,"value":268},") is real per-item work and should keep ",{"type":39,"tag":88,"props":270,"children":272},{"className":271},[],[273],{"type":45,"value":93},{"type":45,"value":275}," off. See the ",{"type":39,"tag":88,"props":277,"children":279},{"className":278},[],[280],{"type":45,"value":281},"n8n-expressions-official",{"type":45,"value":283}," skill's executeOnce section for the full distinction.",{"type":39,"tag":127,"props":285,"children":287},{"id":286},"strong-defaults",[288],{"type":45,"value":289},"Strong defaults",{"type":39,"tag":291,"props":292,"children":293},"ul",{},[294,335,368,390],{"type":39,"tag":58,"props":295,"children":296},{},[297,302,304,309,311,317,319,325,327,333],{"type":39,"tag":62,"props":298,"children":299},{},[300],{"type":45,"value":301},"Don't build a loop when default iteration suffices.",{"type":45,"value":303}," Most nodes (HTTP Request, native service nodes, Set, IF\u002FSwitch) run once per input item automatically: N items in, N runs. To make N HTTP calls or create N records, just connect the source to the node. Don't reach for ",{"type":39,"tag":88,"props":305,"children":307},{"className":306},[],[308],{"type":45,"value":110},{"type":45,"value":310}," unless you need per-iteration control. (Note: ",{"type":39,"tag":88,"props":312,"children":314},{"className":313},[],[315],{"type":45,"value":316},"Execute Workflow",{"type":45,"value":318}," is the exception. It defaults to a single all-items batch. See ",{"type":39,"tag":88,"props":320,"children":322},{"className":321},[],[323],{"type":45,"value":324},"n8n-subworkflows-official",{"type":45,"value":326}," for ",{"type":39,"tag":88,"props":328,"children":330},{"className":329},[],[331],{"type":45,"value":332},"mode: 'each'",{"type":45,"value":334},".)",{"type":39,"tag":58,"props":336,"children":337},{},[338,343,345,350,352,358,360,366],{"type":39,"tag":62,"props":339,"children":340},{},[341],{"type":45,"value":342},"For paginated APIs, use HTTP Request's built-in pagination.",{"type":45,"value":344}," Don't reinvent with ",{"type":39,"tag":88,"props":346,"children":348},{"className":347},[],[349],{"type":45,"value":110},{"type":45,"value":351}," + manual ",{"type":39,"tag":88,"props":353,"children":355},{"className":354},[],[356],{"type":45,"value":357},"$pageCount",{"type":45,"value":359}," unless the API is genuinely odd. See ",{"type":39,"tag":88,"props":361,"children":363},{"className":362},[],[364],{"type":45,"value":365},"references\u002FHTTP_PAGINATION.md",{"type":45,"value":367},".",{"type":39,"tag":58,"props":369,"children":370},{},[371,381,383,389],{"type":39,"tag":62,"props":372,"children":373},{},[374,379],{"type":39,"tag":88,"props":375,"children":377},{"className":376},[],[378],{"type":45,"value":110},{"type":45,"value":380}," is for explicit batching or per-iteration control",{"type":45,"value":382}," (rate limiting, per-batch error recovery, stateful chunks, polling). See ",{"type":39,"tag":88,"props":384,"children":386},{"className":385},[],[387],{"type":45,"value":388},"references\u002FLOOP_OVER_ITEMS.md",{"type":45,"value":367},{"type":39,"tag":58,"props":391,"children":392},{},[393,398,400,405,407,412],{"type":39,"tag":62,"props":394,"children":395},{},[396],{"type":45,"value":397},"Per-item iteration is sequential, not parallel.",{"type":45,"value":399}," Each item completes before the next starts, even on parallel ",{"type":39,"tag":78,"props":401,"children":402},{},[403],{"type":45,"value":404},"looking",{"type":45,"value":406}," branches. For a real concurrency pattern, see ",{"type":39,"tag":88,"props":408,"children":410},{"className":409},[],[411],{"type":45,"value":324},{"type":45,"value":367},{"type":39,"tag":127,"props":414,"children":416},{"id":415},"decision-tree-which-mechanism-do-i-need",[417],{"type":45,"value":418},"Decision tree: which mechanism do I need?",{"type":39,"tag":420,"props":421,"children":425},"pre",{"className":422,"code":424,"language":45},[423],"language-text","Need to do something for each item?\n├── Default per-item iteration is enough\n│   └── Just connect the node. Done.\n│\n├── The node should run once total, not once per item?\n│   └── Set executeOnce: true on the node\n│\n├── Paginated API (multiple HTTP calls to fetch all pages)?\n│   └── Use HTTP Request's Pagination option (see references\u002FHTTP_PAGINATION.md)\n│\n├── Need explicit batching (rate limit, chunk size, per-batch error handling)?\n│   └── Use Loop Over Items node (see references\u002FLOOP_OVER_ITEMS.md)\n│\n└── Need to recurse \u002F repeat with state until a condition is met?\n    └── Loop Over Items with Reset, OR a sub-workflow that calls itself.\n        Both are advanced patterns; see references\u002FLOOP_OVER_ITEMS.md.\n",[426],{"type":39,"tag":88,"props":427,"children":429},{"__ignoreMap":428},"",[430],{"type":45,"value":424},{"type":39,"tag":127,"props":432,"children":434},{"id":433},"executeonce-the-single-fire-setting",[435,440],{"type":39,"tag":88,"props":436,"children":438},{"className":437},[],[439],{"type":45,"value":93},{"type":45,"value":441},": the single-fire setting",{"type":39,"tag":48,"props":443,"children":444},{},[445,447,452,454,459,461,467,468,474],{"type":45,"value":446},"Every node's Settings tab has an ",{"type":39,"tag":62,"props":448,"children":449},{},[450],{"type":45,"value":451},"Execute Once",{"type":45,"value":453}," toggle. When on, the node runs once using only the first input item. In SDK code, set ",{"type":39,"tag":88,"props":455,"children":457},{"className":456},[],[458],{"type":45,"value":185},{"type":45,"value":460}," as shown; on an existing workflow, apply it via ",{"type":39,"tag":88,"props":462,"children":464},{"className":463},[],[465],{"type":45,"value":466},"update_workflow",{"type":45,"value":244},{"type":39,"tag":88,"props":469,"children":471},{"className":470},[],[472],{"type":45,"value":473},"setNodeSettings",{"type":45,"value":475}," (n8n 2.24.0+).",{"type":39,"tag":420,"props":477,"children":481},{"className":478,"code":479,"language":480,"meta":428,"style":428},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n    name: 'Aggregate Slack',\n    type: 'n8n-nodes-base.slack',\n    parameters: { \u002F* ... *\u002F },\n    executeOnce: true,\n}\n","ts",[482],{"type":39,"tag":88,"props":483,"children":484},{"__ignoreMap":428},[485,497,533,563,592,615],{"type":39,"tag":486,"props":487,"children":490},"span",{"class":488,"line":489},"line",1,[491],{"type":39,"tag":486,"props":492,"children":494},{"style":493},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[495],{"type":45,"value":496},"{\n",{"type":39,"tag":486,"props":498,"children":500},{"class":488,"line":499},2,[501,507,512,517,523,528],{"type":39,"tag":486,"props":502,"children":504},{"style":503},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[505],{"type":45,"value":506},"    name",{"type":39,"tag":486,"props":508,"children":509},{"style":493},[510],{"type":45,"value":511},":",{"type":39,"tag":486,"props":513,"children":514},{"style":493},[515],{"type":45,"value":516}," '",{"type":39,"tag":486,"props":518,"children":520},{"style":519},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[521],{"type":45,"value":522},"Aggregate Slack",{"type":39,"tag":486,"props":524,"children":525},{"style":493},[526],{"type":45,"value":527},"'",{"type":39,"tag":486,"props":529,"children":530},{"style":493},[531],{"type":45,"value":532},",\n",{"type":39,"tag":486,"props":534,"children":536},{"class":488,"line":535},3,[537,542,546,550,555,559],{"type":39,"tag":486,"props":538,"children":539},{"style":503},[540],{"type":45,"value":541},"    type",{"type":39,"tag":486,"props":543,"children":544},{"style":493},[545],{"type":45,"value":511},{"type":39,"tag":486,"props":547,"children":548},{"style":493},[549],{"type":45,"value":516},{"type":39,"tag":486,"props":551,"children":552},{"style":519},[553],{"type":45,"value":554},"n8n-nodes-base.slack",{"type":39,"tag":486,"props":556,"children":557},{"style":493},[558],{"type":45,"value":527},{"type":39,"tag":486,"props":560,"children":561},{"style":493},[562],{"type":45,"value":532},{"type":39,"tag":486,"props":564,"children":566},{"class":488,"line":565},4,[567,572,576,581,587],{"type":39,"tag":486,"props":568,"children":569},{"style":503},[570],{"type":45,"value":571},"    parameters",{"type":39,"tag":486,"props":573,"children":574},{"style":493},[575],{"type":45,"value":511},{"type":39,"tag":486,"props":577,"children":578},{"style":493},[579],{"type":45,"value":580}," {",{"type":39,"tag":486,"props":582,"children":584},{"style":583},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[585],{"type":45,"value":586}," \u002F* ... *\u002F",{"type":39,"tag":486,"props":588,"children":589},{"style":493},[590],{"type":45,"value":591}," },\n",{"type":39,"tag":486,"props":593,"children":595},{"class":488,"line":594},5,[596,601,605,611],{"type":39,"tag":486,"props":597,"children":598},{"style":503},[599],{"type":45,"value":600},"    executeOnce",{"type":39,"tag":486,"props":602,"children":603},{"style":493},[604],{"type":45,"value":511},{"type":39,"tag":486,"props":606,"children":608},{"style":607},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[609],{"type":45,"value":610}," true",{"type":39,"tag":486,"props":612,"children":613},{"style":493},[614],{"type":45,"value":532},{"type":39,"tag":486,"props":616,"children":618},{"class":488,"line":617},6,[619],{"type":39,"tag":486,"props":620,"children":621},{"style":493},[622],{"type":45,"value":623},"}\n",{"type":39,"tag":48,"props":625,"children":626},{},[627],{"type":45,"value":628},"When to use it:",{"type":39,"tag":291,"props":630,"children":631},{},[632,642,660],{"type":39,"tag":58,"props":633,"children":634},{},[635,640],{"type":39,"tag":62,"props":636,"children":637},{},[638],{"type":45,"value":639},"Notifications and aggregate writes.",{"type":45,"value":641}," A \"summary message\" shouldn't fire 100 times because 100 items came in.",{"type":39,"tag":58,"props":643,"children":644},{},[645,650,652,658],{"type":39,"tag":62,"props":646,"children":647},{},[648],{"type":45,"value":649},"Counters, totals, reports.",{"type":45,"value":651}," Anything computing ",{"type":39,"tag":88,"props":653,"children":655},{"className":654},[],[656],{"type":45,"value":657},"$input.all().length",{"type":45,"value":659}," etc. should run once.",{"type":39,"tag":58,"props":661,"children":662},{},[663,680,682,687,689,694,696,701,703,708],{"type":39,"tag":62,"props":664,"children":665},{},[666,668,673,674,679],{"type":45,"value":667},"Expressions aggregating across the full array via ",{"type":39,"tag":88,"props":669,"children":671},{"className":670},[],[672],{"type":45,"value":202},{"type":45,"value":204},{"type":39,"tag":88,"props":675,"children":677},{"className":676},[],[678],{"type":45,"value":210},{"type":45,"value":367},{"type":45,"value":681}," Otherwise the aggregate runs per upstream item. (Per-item ",{"type":39,"tag":78,"props":683,"children":684},{},[685],{"type":45,"value":686},"lookups",{"type":45,"value":688}," using ",{"type":39,"tag":88,"props":690,"children":692},{"className":691},[],[693],{"type":45,"value":250},{"type":45,"value":695}," filtered by another node's ",{"type":39,"tag":88,"props":697,"children":699},{"className":698},[],[700],{"type":45,"value":258},{"type":45,"value":702}," are the counter-case, see ",{"type":39,"tag":88,"props":704,"children":706},{"className":705},[],[707],{"type":45,"value":281},{"type":45,"value":334},{"type":39,"tag":48,"props":710,"children":711},{},[712],{"type":45,"value":713},"When NOT to use it:",{"type":39,"tag":291,"props":715,"children":716},{},[717,734],{"type":39,"tag":58,"props":718,"children":719},{},[720,725,727,732],{"type":39,"tag":62,"props":721,"children":722},{},[723],{"type":45,"value":724},"Per-item operations.",{"type":45,"value":726}," One notification ",{"type":39,"tag":78,"props":728,"children":729},{},[730],{"type":45,"value":731},"per",{"type":45,"value":733}," item is the default and usually correct.",{"type":39,"tag":58,"props":735,"children":736},{},[737,742],{"type":39,"tag":62,"props":738,"children":739},{},[740],{"type":45,"value":741},"HTTP requests fanning out per item.",{"type":45,"value":743}," You want one call per item.",{"type":39,"tag":48,"props":745,"children":746},{},[747,749,754],{"type":45,"value":748},"Most common mistake: forgetting ",{"type":39,"tag":88,"props":750,"children":752},{"className":751},[],[753],{"type":45,"value":93},{"type":45,"value":755}," on an aggregate node, then seeing the same message fire 50 times after a fan-out.",{"type":39,"tag":127,"props":757,"children":759},{"id":758},"when-the-implicit-loop-bites-you",[760],{"type":45,"value":761},"When the implicit loop bites you",{"type":39,"tag":48,"props":763,"children":764},{},[765],{"type":45,"value":766},"Default per-item iteration is great until it isn't. Common surprises:",{"type":39,"tag":768,"props":769,"children":771},"h3",{"id":770},"a-single-config-node-fires-per-item",[772],{"type":45,"value":773},"A \"single\" config node fires per item",{"type":39,"tag":48,"props":775,"children":776},{},[777,779,785,787,793,795,800],{"type":45,"value":778},"A ",{"type":39,"tag":88,"props":780,"children":782},{"className":781},[],[783],{"type":45,"value":784},"Set",{"type":45,"value":786}," node after a fan-out runs once per item, producing N copies of the same constants. Usually fine, but expensive expressions (long ",{"type":39,"tag":88,"props":788,"children":790},{"className":789},[],[791],{"type":45,"value":792},"JSON.stringify",{"type":45,"value":794},", Luxon parse) run N times. Move the Set above the fan-out, or set ",{"type":39,"tag":88,"props":796,"children":798},{"className":797},[],[799],{"type":45,"value":185},{"type":45,"value":367},{"type":39,"tag":768,"props":802,"children":804},{"id":803},"an-aggregate-code-node-runs-n-times",[805],{"type":45,"value":806},"An aggregate Code node runs N times",{"type":39,"tag":48,"props":808,"children":809},{},[810,812,817,819,824,826,831],{"type":45,"value":811},"A Code node reading ",{"type":39,"tag":88,"props":813,"children":815},{"className":814},[],[816],{"type":45,"value":202},{"type":45,"value":818}," to compute a sum runs once per upstream item without ",{"type":39,"tag":88,"props":820,"children":822},{"className":821},[],[823],{"type":45,"value":185},{"type":45,"value":825},", producing N identical items. Set ",{"type":39,"tag":88,"props":827,"children":829},{"className":828},[],[830],{"type":45,"value":185},{"type":45,"value":367},{"type":39,"tag":768,"props":833,"children":835},{"id":834},"a-respond-to-webhook-fires-twice",[836],{"type":45,"value":837},"A respond-to-webhook fires twice",{"type":39,"tag":48,"props":839,"children":840},{},[841,843,849,850,856],{"type":45,"value":842},"Most painful version. Respond-to-Webhook fires per input item, and two branches converging without a merge fire it twice: first response wins, the rest log errors. Merge first, or ensure only one branch reaches the responder. See ",{"type":39,"tag":88,"props":844,"children":846},{"className":845},[],[847],{"type":45,"value":848},"n8n-node-configuration-official",{"type":45,"value":244},{"type":39,"tag":88,"props":851,"children":853},{"className":852},[],[854],{"type":45,"value":855},"references\u002FMERGE_NODE.md",{"type":45,"value":367},{"type":39,"tag":768,"props":858,"children":860},{"id":859},"an-llm-call-fires-n-times-when-you-wanted-one-summary",[861],{"type":45,"value":862},"An LLM call fires N times when you wanted one summary",{"type":39,"tag":48,"props":864,"children":865},{},[866,868,873,875,880],{"type":45,"value":867},"Same shape as the aggregate Code node. An LLM node with ",{"type":39,"tag":88,"props":869,"children":871},{"className":870},[],[872],{"type":45,"value":202},{"type":45,"value":874}," in its prompt makes N identical calls, costs N tokens, returns N identical answers without ",{"type":39,"tag":88,"props":876,"children":878},{"className":877},[],[879],{"type":45,"value":185},{"type":45,"value":367},{"type":39,"tag":127,"props":882,"children":884},{"id":883},"when-to-reach-for-loop-over-items",[885,887],{"type":45,"value":886},"When to reach for ",{"type":39,"tag":88,"props":888,"children":890},{"className":889},[],[891],{"type":45,"value":110},{"type":39,"tag":48,"props":893,"children":894},{},[895,897,902],{"type":45,"value":896},"Default iteration handles most cases. Use ",{"type":39,"tag":88,"props":898,"children":900},{"className":899},[],[901],{"type":45,"value":110},{"type":45,"value":903}," for:",{"type":39,"tag":291,"props":905,"children":906},{},[907,917,927,937,947,973],{"type":39,"tag":58,"props":908,"children":909},{},[910,915],{"type":39,"tag":62,"props":911,"children":912},{},[913],{"type":45,"value":914},"Rate limiting.",{"type":45,"value":916}," \"Process 10 at a time, 1s wait between batches.\"",{"type":39,"tag":58,"props":918,"children":919},{},[920,925],{"type":39,"tag":62,"props":921,"children":922},{},[923],{"type":45,"value":924},"Batched API calls with array bodies.",{"type":45,"value":926}," \"Send 50-item chunks to \u002Fbulk.\"",{"type":39,"tag":58,"props":928,"children":929},{},[930,935],{"type":39,"tag":62,"props":931,"children":932},{},[933],{"type":45,"value":934},"Per-batch error handling.",{"type":45,"value":936}," \"If a batch fails, log and continue.\"",{"type":39,"tag":58,"props":938,"children":939},{},[940,945],{"type":39,"tag":62,"props":941,"children":942},{},[943],{"type":45,"value":944},"Stateful iteration.",{"type":45,"value":946}," \"Each iteration depends on the previous output.\"",{"type":39,"tag":58,"props":948,"children":949},{},[950,955,957,963,965,971],{"type":39,"tag":62,"props":951,"children":952},{},[953],{"type":45,"value":954},"Polling a long-running job.",{"type":45,"value":956}," \"Start, check status every 30s until done or capped.\" Uses ",{"type":39,"tag":88,"props":958,"children":960},{"className":959},[],[961],{"type":45,"value":962},"reset: true",{"type":45,"value":964}," plus a ",{"type":39,"tag":88,"props":966,"children":968},{"className":967},[],[969],{"type":45,"value":970},"$runIndex",{"type":45,"value":972}," ceiling.",{"type":39,"tag":58,"props":974,"children":975},{},[976,981],{"type":39,"tag":62,"props":977,"children":978},{},[979],{"type":45,"value":980},"Per-item multi-branch with aggregation.",{"type":45,"value":982}," \"For each input, run transforms in parallel, merge, then aggregate.\" The done output (index 0) carries the result.",{"type":39,"tag":48,"props":984,"children":985},{},[986,988,993,995,1000,1002,1007],{"type":45,"value":987},"For wiring details, the output-index gotcha (output 0 = ",{"type":39,"tag":62,"props":989,"children":990},{},[991],{"type":45,"value":992},"done",{"type":45,"value":994},", output 1 = ",{"type":39,"tag":62,"props":996,"children":997},{},[998],{"type":45,"value":999},"loop",{"type":45,"value":1001},"), and worked examples, see ",{"type":39,"tag":88,"props":1003,"children":1005},{"className":1004},[],[1006],{"type":45,"value":388},{"type":45,"value":367},{"type":39,"tag":127,"props":1009,"children":1011},{"id":1010},"when-not-to-reach-for-loop-over-items",[1012,1014],{"type":45,"value":1013},"When NOT to reach for ",{"type":39,"tag":88,"props":1015,"children":1017},{"className":1016},[],[1018],{"type":45,"value":110},{"type":39,"tag":48,"props":1020,"children":1021},{},[1022,1024,1029,1031,1036],{"type":45,"value":1023},"The most common rationalization: \"I need to wait for all items to finish before the next step, so I'll add Loop Over Items and use the ",{"type":39,"tag":88,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":45,"value":992},{"type":45,"value":1030}," output.\" ",{"type":39,"tag":62,"props":1032,"children":1033},{},[1034],{"type":45,"value":1035},"You don't need Loop Over Items for that.",{"type":45,"value":1037}," Default per-item iteration already waits: each item flows through the full downstream chain before the next item starts, and the post-loop node never fires \"early.\"",{"type":39,"tag":48,"props":1039,"children":1040},{},[1041,1043,1048],{"type":45,"value":1042},"The cure for that mistake is almost always: ",{"type":39,"tag":62,"props":1044,"children":1045},{},[1046],{"type":45,"value":1047},"delete the Loop Over Items node, change nothing else, ship",{"type":45,"value":1049},". That is Scenario 1 below, and it covers the majority of cases.",{"type":39,"tag":48,"props":1051,"children":1052},{},[1053],{"type":45,"value":1054},"The four scenarios are independent. Read them as separate decisions, not as alternatives that all \"replace\" Loop Over Items. Most builds hit Scenario 1 and are done. Scenarios 2 and 3 only enter the picture when their specific goal applies. Scenario 4 is the narrow case where Loop Over Items actually earns its place.",{"type":39,"tag":768,"props":1056,"children":1058},{"id":1057},"scenario-1-default-per-item-iteration-the-default-most-common",[1059],{"type":45,"value":1060},"Scenario 1: default per-item iteration (the default, most common)",{"type":39,"tag":48,"props":1062,"children":1063},{},[1064,1066,1078],{"type":45,"value":1065},"Source emits N items, per-item processor runs N times, downstream chain follows. ",{"type":39,"tag":62,"props":1067,"children":1068},{},[1069,1071,1076],{"type":45,"value":1070},"No Loop Over Items, no ",{"type":39,"tag":88,"props":1072,"children":1074},{"className":1073},[],[1075],{"type":45,"value":93},{"type":45,"value":1077},", no Aggregate.",{"type":45,"value":1079}," Just connect the nodes.",{"type":39,"tag":420,"props":1081,"children":1084},{"className":1082,"code":1083,"language":45},[423],"[Source: 20 items]\n  → [Per-item processor]   # default iter, runs 20 times\n  → [Next step]            # runs after each item, in order\n",[1085],{"type":39,"tag":88,"props":1086,"children":1087},{"__ignoreMap":428},[1088],{"type":45,"value":1083},{"type":39,"tag":48,"props":1090,"children":1091},{},[1092,1094,1100,1102,1107,1109,1114,1116,1121,1123,1128],{"type":45,"value":1093},"If a ",{"type":39,"tag":88,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":45,"value":1099},"Loop Over Items + done",{"type":45,"value":1101}," was added here \"to wait for all items\" or \"to make the next node run for each item,\" delete the Loop Over Items node and wire source straight to processor. ",{"type":39,"tag":62,"props":1103,"children":1104},{},[1105],{"type":45,"value":1106},"Do not replace it with anything.",{"type":45,"value":1108}," Default iteration already does the job. The exception is ",{"type":39,"tag":88,"props":1110,"children":1112},{"className":1111},[],[1113],{"type":45,"value":316},{"type":45,"value":1115}," (sub-workflow): it defaults to a single all-items batch, so per-item invocation needs ",{"type":39,"tag":88,"props":1117,"children":1119},{"className":1118},[],[1120],{"type":45,"value":332},{"type":45,"value":1122}," on that node, not a Loop. See ",{"type":39,"tag":88,"props":1124,"children":1126},{"className":1125},[],[1127],{"type":45,"value":324},{"type":45,"value":367},{"type":39,"tag":768,"props":1130,"children":1132},{"id":1131},"scenario-2-a-downstream-node-should-fire-once-total-executeonce-true",[1133,1135,1140],{"type":45,"value":1134},"Scenario 2: a downstream node should fire once total (",{"type":39,"tag":88,"props":1136,"children":1138},{"className":1137},[],[1139],{"type":45,"value":185},{"type":45,"value":1141},")",{"type":39,"tag":48,"props":1143,"children":1144},{},[1145],{"type":45,"value":1146},"Independent of Scenario 1. Triggered only when there is a SPECIFIC downstream node whose job is once-per-run, not once-per-item: one digest email after 20 papers process, one summary write after the loop, one final Slack notification.",{"type":39,"tag":48,"props":1148,"children":1149},{},[1150,1152,1157],{"type":45,"value":1151},"Set ",{"type":39,"tag":88,"props":1153,"children":1155},{"className":1154},[],[1156],{"type":45,"value":185},{"type":45,"value":1158}," on that node. The node receives all upstream items but runs once. This is a per-node setting, not a Loop replacement: the per-item processor in Scenario 1 still runs N times, and only this one downstream node collapses.",{"type":39,"tag":768,"props":1160,"children":1162},{"id":1161},"scenario-3-a-node-needs-the-items-as-a-single-array-aggregate",[1163],{"type":45,"value":1164},"Scenario 3: a node needs the items as a single array (Aggregate)",{"type":39,"tag":48,"props":1166,"children":1167},{},[1168],{"type":45,"value":1169},"Independent of Scenario 1. Triggered only when a downstream node's input contract is a list, not per-item invocations (e.g., a node taking a JSON array body, an LLM prompt that needs the whole list).",{"type":39,"tag":48,"props":1171,"children":1172},{},[1173],{"type":45,"value":1174},"Use the Aggregate node to collapse the per-item stream into one item containing the array. Again, not a Loop replacement.",{"type":39,"tag":768,"props":1176,"children":1178},{"id":1177},"scenario-4-genuine-batching-the-only-time-loop-over-items-earns-its-place",[1179],{"type":45,"value":1180},"Scenario 4: genuine batching (the only time Loop Over Items earns its place)",{"type":39,"tag":48,"props":1182,"children":1183},{},[1184,1186,1192,1194,1199,1201,1206],{"type":45,"value":1185},"Rate limiting (process N at a time with a Wait between batches), chunked bulk API calls (POST 50-item arrays to ",{"type":39,"tag":88,"props":1187,"children":1189},{"className":1188},[],[1190],{"type":45,"value":1191},"\u002Fbulk",{"type":45,"value":1193},"), per-batch error handling, polling a long-running job with ",{"type":39,"tag":88,"props":1195,"children":1197},{"className":1196},[],[1198],{"type":45,"value":962},{"type":45,"value":1200}," and a ",{"type":39,"tag":88,"props":1202,"children":1204},{"className":1203},[],[1205],{"type":45,"value":970},{"type":45,"value":1207}," ceiling, stateful iteration where each batch depends on the previous output.",{"type":39,"tag":48,"props":1209,"children":1210},{},[1211],{"type":45,"value":1212},"\"Wait for items to finish\" does not qualify. Default iteration already does that.",{"type":39,"tag":768,"props":1214,"children":1216},{"id":1215},"quick-disambiguation",[1217],{"type":45,"value":1218},"Quick disambiguation",{"type":39,"tag":48,"props":1220,"children":1221},{},[1222,1224,1229],{"type":45,"value":1223},"If your only reason for the Loop is \"wait for items \u002F run for each item,\" you are in Scenario 1. Delete the Loop. Do not add ",{"type":39,"tag":88,"props":1225,"children":1227},{"className":1226},[],[1228],{"type":45,"value":93},{"type":45,"value":1230}," or Aggregate as a substitute. They solve different problems and are only added when their own scenario applies.",{"type":39,"tag":127,"props":1232,"children":1234},{"id":1233},"when-to-reach-for-http-pagination",[1235],{"type":45,"value":1236},"When to reach for HTTP pagination",{"type":39,"tag":48,"props":1238,"children":1239},{},[1240],{"type":45,"value":1241},"Three common page shapes:",{"type":39,"tag":291,"props":1243,"children":1244},{},[1245,1263,1289],{"type":39,"tag":58,"props":1246,"children":1247},{},[1248,1253,1255,1261],{"type":39,"tag":62,"props":1249,"children":1250},{},[1251],{"type":45,"value":1252},"Next-URL in response.",{"type":45,"value":1254}," Each response includes a ",{"type":39,"tag":88,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":45,"value":1260},"next",{"type":45,"value":1262}," link.",{"type":39,"tag":58,"props":1264,"children":1265},{},[1266,1271,1273,1279,1281,1287],{"type":39,"tag":62,"props":1267,"children":1268},{},[1269],{"type":45,"value":1270},"Page number\u002Fcursor parameter.",{"type":45,"value":1272}," Bump ",{"type":39,"tag":88,"props":1274,"children":1276},{"className":1275},[],[1277],{"type":45,"value":1278},"?page=N",{"type":45,"value":1280}," or ",{"type":39,"tag":88,"props":1282,"children":1284},{"className":1283},[],[1285],{"type":45,"value":1286},"?cursor=...",{"type":45,"value":1288}," each call.",{"type":39,"tag":58,"props":1290,"children":1291},{},[1292,1297],{"type":39,"tag":62,"props":1293,"children":1294},{},[1295],{"type":45,"value":1296},"Stop on empty page",{"type":45,"value":1298}," or specific status.",{"type":39,"tag":48,"props":1300,"children":1301},{},[1302,1304,1309],{"type":45,"value":1303},"HTTP Request handles all natively via its ",{"type":39,"tag":62,"props":1305,"children":1306},{},[1307],{"type":45,"value":1308},"Pagination",{"type":45,"value":1310}," option: set the mode, give a next-page expression, and the node loops internally, returning a single output array of all pages' items.",{"type":39,"tag":48,"props":1312,"children":1313},{},[1314,1316,1321,1322,1327],{"type":45,"value":1315},"Don't reinvent with ",{"type":39,"tag":88,"props":1317,"children":1319},{"className":1318},[],[1320],{"type":45,"value":110},{"type":45,"value":351},{"type":39,"tag":88,"props":1323,"children":1325},{"className":1324},[],[1326],{"type":45,"value":357},{"type":45,"value":1328}," unless the API does something the built-in modes can't express.",{"type":39,"tag":48,"props":1330,"children":1331},{},[1332,1334,1339],{"type":45,"value":1333},"See ",{"type":39,"tag":88,"props":1335,"children":1337},{"className":1336},[],[1338],{"type":45,"value":365},{"type":45,"value":367},{"type":39,"tag":127,"props":1341,"children":1343},{"id":1342},"sub-workflow-recursion",[1344],{"type":45,"value":1345},"Sub-workflow recursion",{"type":39,"tag":48,"props":1347,"children":1348},{},[1349,1351,1356,1358,1364],{"type":45,"value":1350},"For genuinely recursive work (tree walking, retry-with-backoff, \"process this and its children\"), a self-calling sub-workflow is cleaner than ",{"type":39,"tag":88,"props":1352,"children":1354},{"className":1353},[],[1355],{"type":45,"value":110},{"type":45,"value":1357}," with ",{"type":39,"tag":88,"props":1359,"children":1361},{"className":1360},[],[1362],{"type":45,"value":1363},"Reset",{"type":45,"value":1365},". Input parameters carry recursion state.",{"type":39,"tag":420,"props":1367,"children":1370},{"className":1368,"code":1369,"language":45},[423],"Sub-workflow: Walk Tree\n  inputs: { node_id, depth }\n  body: process node, look up children, for each child call self with depth+1\n",[1371],{"type":39,"tag":88,"props":1372,"children":1373},{"__ignoreMap":428},[1374],{"type":45,"value":1369},{"type":39,"tag":48,"props":1376,"children":1377},{},[1378],{"type":45,"value":1379},"Watch recursion depth. n8n has nested-execution limits. For deep recursion, a queue + flat loop beats true recursion.",{"type":39,"tag":127,"props":1381,"children":1383},{"id":1382},"reference-files",[1384],{"type":45,"value":1385},"Reference files",{"type":39,"tag":1387,"props":1388,"children":1389},"table",{},[1390,1409],{"type":39,"tag":1391,"props":1392,"children":1393},"thead",{},[1394],{"type":39,"tag":1395,"props":1396,"children":1397},"tr",{},[1398,1404],{"type":39,"tag":1399,"props":1400,"children":1401},"th",{},[1402],{"type":45,"value":1403},"File",{"type":39,"tag":1399,"props":1405,"children":1406},{},[1407],{"type":45,"value":1408},"Read when",{"type":39,"tag":1410,"props":1411,"children":1412},"tbody",{},[1413,1430],{"type":39,"tag":1395,"props":1414,"children":1415},{},[1416,1425],{"type":39,"tag":1417,"props":1418,"children":1419},"td",{},[1420],{"type":39,"tag":88,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":45,"value":388},{"type":39,"tag":1417,"props":1426,"children":1427},{},[1428],{"type":45,"value":1429},"Configuring the Loop Over Items node, batching, rate limiting, stateful iteration",{"type":39,"tag":1395,"props":1431,"children":1432},{},[1433,1441],{"type":39,"tag":1417,"props":1434,"children":1435},{},[1436],{"type":39,"tag":88,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":45,"value":365},{"type":39,"tag":1417,"props":1442,"children":1443},{},[1444],{"type":45,"value":1445},"Calling a paginated API, configuring HTTP Request pagination modes",{"type":39,"tag":127,"props":1447,"children":1449},{"id":1448},"anti-patterns",[1450],{"type":45,"value":1451},"Anti-patterns",{"type":39,"tag":1387,"props":1453,"children":1454},{},[1455,1476],{"type":39,"tag":1391,"props":1456,"children":1457},{},[1458],{"type":39,"tag":1395,"props":1459,"children":1460},{},[1461,1466,1471],{"type":39,"tag":1399,"props":1462,"children":1463},{},[1464],{"type":45,"value":1465},"Anti-pattern",{"type":39,"tag":1399,"props":1467,"children":1468},{},[1469],{"type":45,"value":1470},"What goes wrong",{"type":39,"tag":1399,"props":1472,"children":1473},{},[1474],{"type":45,"value":1475},"Fix",{"type":39,"tag":1410,"props":1477,"children":1478},{},[1479,1504,1531,1568,1591,1615,1644],{"type":39,"tag":1395,"props":1480,"children":1481},{},[1482,1494,1499],{"type":39,"tag":1417,"props":1483,"children":1484},{},[1485,1487,1492],{"type":45,"value":1486},"Adding ",{"type":39,"tag":88,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":45,"value":110},{"type":45,"value":1493}," to \"make it loop\" when default iteration already does",{"type":39,"tag":1417,"props":1495,"children":1496},{},[1497],{"type":45,"value":1498},"Workflow harder to read for no benefit, and loop output vs done output gets miswired",{"type":39,"tag":1417,"props":1500,"children":1501},{},[1502],{"type":45,"value":1503},"Just connect the node directly and let default iteration handle it",{"type":39,"tag":1395,"props":1505,"children":1506},{},[1507,1517,1522],{"type":39,"tag":1417,"props":1508,"children":1509},{},[1510,1512],{"type":45,"value":1511},"Aggregate Code node without ",{"type":39,"tag":88,"props":1513,"children":1515},{"className":1514},[],[1516],{"type":45,"value":93},{"type":39,"tag":1417,"props":1518,"children":1519},{},[1520],{"type":45,"value":1521},"Same aggregate computed N times, output has N identical items",{"type":39,"tag":1417,"props":1523,"children":1524},{},[1525,1526],{"type":45,"value":1151},{"type":39,"tag":88,"props":1527,"children":1529},{"className":1528},[],[1530],{"type":45,"value":185},{"type":39,"tag":1395,"props":1532,"children":1533},{},[1534,1551,1556],{"type":39,"tag":1417,"props":1535,"children":1536},{},[1537,1539,1544,1546],{"type":45,"value":1538},"Manual pagination loop with ",{"type":39,"tag":88,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":45,"value":110},{"type":45,"value":1545}," + ",{"type":39,"tag":88,"props":1547,"children":1549},{"className":1548},[],[1550],{"type":45,"value":357},{"type":39,"tag":1417,"props":1552,"children":1553},{},[1554],{"type":45,"value":1555},"Reinvents what HTTP Request does natively, with brittle stop conditions",{"type":39,"tag":1417,"props":1557,"children":1558},{},[1559,1561,1566],{"type":45,"value":1560},"Use HTTP Request's ",{"type":39,"tag":88,"props":1562,"children":1564},{"className":1563},[],[1565],{"type":45,"value":1308},{"type":45,"value":1567}," option",{"type":39,"tag":1395,"props":1569,"children":1570},{},[1571,1576,1581],{"type":39,"tag":1417,"props":1572,"children":1573},{},[1574],{"type":45,"value":1575},"Sending one Slack message per item when you wanted a summary",{"type":39,"tag":1417,"props":1577,"children":1578},{},[1579],{"type":45,"value":1580},"Slack channel floods, rate limits hit, embarrassment",{"type":39,"tag":1417,"props":1582,"children":1583},{},[1584,1589],{"type":39,"tag":88,"props":1585,"children":1587},{"className":1586},[],[1588],{"type":45,"value":185},{"type":45,"value":1590}," on the Slack node, build the summary upstream",{"type":39,"tag":1395,"props":1592,"children":1593},{},[1594,1605,1610],{"type":39,"tag":1417,"props":1595,"children":1596},{},[1597,1599],{"type":45,"value":1598},"Two branches both reach ",{"type":39,"tag":88,"props":1600,"children":1602},{"className":1601},[],[1603],{"type":45,"value":1604},"Respond to Webhook",{"type":39,"tag":1417,"props":1606,"children":1607},{},[1608],{"type":45,"value":1609},"Responds twice, downstream callers see errors",{"type":39,"tag":1417,"props":1611,"children":1612},{},[1613],{"type":45,"value":1614},"Merge before the responder, or ensure only one branch reaches it",{"type":39,"tag":1395,"props":1616,"children":1617},{},[1618,1634,1639],{"type":39,"tag":1417,"props":1619,"children":1620},{},[1621,1626,1627,1632],{"type":39,"tag":88,"props":1622,"children":1624},{"className":1623},[],[1625],{"type":45,"value":110},{"type":45,"value":1357},{"type":39,"tag":88,"props":1628,"children":1630},{"className":1629},[],[1631],{"type":45,"value":1363},{"type":45,"value":1633}," and no clear termination",{"type":39,"tag":1417,"props":1635,"children":1636},{},[1637],{"type":45,"value":1638},"Infinite loop, n8n eats memory until the execution is killed",{"type":39,"tag":1417,"props":1640,"children":1641},{},[1642],{"type":45,"value":1643},"Always have a clear termination condition. Prefer HTTP pagination for paged APIs",{"type":39,"tag":1395,"props":1645,"children":1646},{},[1647,1659,1664],{"type":39,"tag":1417,"props":1648,"children":1649},{},[1650,1652,1657],{"type":45,"value":1651},"Nesting one ",{"type":39,"tag":88,"props":1653,"children":1655},{"className":1654},[],[1656],{"type":45,"value":110},{"type":45,"value":1658}," inside another in the same workflow",{"type":39,"tag":1417,"props":1660,"children":1661},{},[1662],{"type":45,"value":1663},"Broken at runtime, validation passes",{"type":39,"tag":1417,"props":1665,"children":1666},{},[1667,1669,1674,1675],{"type":45,"value":1668},"Move the inner loop into a sub-workflow called per outer iteration. See ",{"type":39,"tag":88,"props":1670,"children":1672},{"className":1671},[],[1673],{"type":45,"value":324},{"type":45,"value":244},{"type":39,"tag":88,"props":1676,"children":1678},{"className":1677},[],[1679],{"type":45,"value":332},{"type":39,"tag":1681,"props":1682,"children":1683},"style",{},[1684],{"type":45,"value":1685},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1687,"total":1790},[1688,1702,1715,1731,1749,1764,1777],{"slug":1689,"name":1689,"fn":1690,"description":1691,"org":1692,"tags":1693,"stars":23,"repoUrl":24,"updatedAt":1701},"n8n-agents-official","build AI agents in n8n","Use when building or editing any AI feature in n8n: AI Agents, Text Classifier, Information Extractor, Sentiment Analysis, Summarization Chain, Basic LLM Chain, embeddings, vector stores, single one-shot LLM calls, or AI media generation (image \u002F audio \u002F video) via the native LangChain provider nodes. Triggers on any `@n8n\u002Fn8n-nodes-langchain.*` node, \"agent\", \"chat assistant\", \"LLM with tools\", \"tool calling\", \"fromAi\", \"system prompt\", \"memory window\", \"structured output\", \"outputParser\", \"function calling\", \"RAG\", \"vector store\", \"embeddings\", \"classify with AI\", \"extract fields with LLM\", \"sentiment analysis\", \"summarize with LLM\", \"single LLM call\", chat triggers with files, AI image \u002F video \u002F audio generation, or any multi-turn or one-shot LLM behavior.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1694,1697,1700],{"name":1695,"slug":1696,"type":13},"Agents","agents",{"name":1698,"slug":1699,"type":13},"LLM","llm",{"name":21,"slug":22,"type":13},"2026-07-08T05:44:47.938896",{"slug":1703,"name":1703,"fn":1704,"description":1705,"org":1706,"tags":1707,"stars":23,"repoUrl":24,"updatedAt":1714},"n8n-binary-and-data-official","handle binary data and files in n8n","Use when handling files, images, attachments, or binary data in n8n, OR when an AI agent needs to take a user-uploaded file as tool input or return a generated file. For Data Tables (schemas, dedup, persistent state), see the separate n8n-data-tables-official skill. Triggers on \"file\", \"image\", \"PDF\", \"attachment\", \"binary\", \"upload\", \"download\", chat trigger with files, agent tool that needs a file, vision\u002Fmultimodal, or any handling of non-JSON file data.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1708,1709,1712,1713],{"name":15,"slug":16,"type":13},{"name":1710,"slug":1711,"type":13},"File Uploads","file-uploads",{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-08T05:45:01.884342",{"slug":1716,"name":1716,"fn":1717,"description":1718,"org":1719,"tags":1720,"stars":23,"repoUrl":24,"updatedAt":1730},"n8n-code-nodes-official","write custom logic in n8n","Use when the user reaches for a Code node, mentions writing JavaScript or Python in n8n, or any custom logic comes up in workflow design. Triggers on \"Code node\", \"Code\", \"JavaScript\", \"Python\", \"custom logic\", \"transform data\", \"$input\", \"$json transformation\", \"loop in code\", \"write a function\", or any time the obvious answer seems to be \"just put it in code.\"",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1721,1724,1727],{"name":1722,"slug":1723,"type":13},"Engineering","engineering",{"name":1725,"slug":1726,"type":13},"JavaScript","javascript",{"name":1728,"slug":1729,"type":13},"Python","python","2026-07-08T05:44:49.656127",{"slug":1732,"name":1732,"fn":1733,"description":1734,"org":1735,"tags":1736,"stars":23,"repoUrl":24,"updatedAt":1748},"n8n-credentials-and-security-official","manage credentials and security in n8n","Use when handling any auth, API keys, tokens, OAuth, bearer tokens, basic auth, or secret values in n8n workflows. Triggers on \"API key\", \"token\", \"bearer\", \"OAuth\", \"secret\", \"auth\", \"credentials\", \"Authorization header\", \"x-api-key\", or any node configuration that mentions a third-party service.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1737,1740,1741,1742,1745],{"name":1738,"slug":1739,"type":13},"Authentication","authentication",{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":1743,"slug":1744,"type":13},"OAuth","oauth",{"name":1746,"slug":1747,"type":13},"Security","security","2026-07-08T05:45:07.766252",{"slug":1750,"name":1750,"fn":1751,"description":1752,"org":1753,"tags":1754,"stars":23,"repoUrl":24,"updatedAt":1763},"n8n-data-tables-official","manage n8n Data Tables","Use when working with n8n's built-in Data Tables, designing schemas, inserting\u002Fupdating\u002Fupserting rows, deduping, or querying. Triggers on \"Data Table\", \"data table\", `n8n-nodes-base.dataTable`, \"dedup\", \"idempotency\", \"lookup\", \"persistent state\", \"store across executions\", or any schema design discussion inside n8n.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1755,1758,1761,1762],{"name":1756,"slug":1757,"type":13},"Data Modeling","data-modeling",{"name":1759,"slug":1760,"type":13},"Database","database",{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-08T05:44:52.048039",{"slug":1765,"name":1765,"fn":1766,"description":1767,"org":1768,"tags":1769,"stars":23,"repoUrl":24,"updatedAt":1776},"n8n-debugging-official","debug and fix n8n workflow errors","Use when an n8n workflow isn't working, errors appear, results don't match what was expected, or the user says \"this isn't working.\" Triggers on errors, unexpected output, \"it's not working\", \"why is this happening\", \"the workflow stopped\", failure investigation, or any debugging context.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1770,1771,1774,1775],{"name":15,"slug":16,"type":13},{"name":1772,"slug":1773,"type":13},"Debugging","debugging",{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-08T05:45:05.897341",{"slug":1778,"name":1778,"fn":1779,"description":1780,"org":1781,"tags":1782,"stars":23,"repoUrl":24,"updatedAt":1789},"n8n-error-handling-official","implement error handling in n8n","Use when building any webhook-triggered workflow, scheduled\u002Fproduction-bound workflow, wiring a per-node error output, or any workflow where silent failure would drop user-visible work. Triggers on \"webhook\", \"respond to webhook\", \"API\", \"production\", \"error\", \"failure\", \"5xx\", \"try\u002Fcatch\", \"error workflow\", \"onError\", \"continueErrorOutput\", \"error branch\", \"node error output\", \"output(1)\", \"main[1]\", \"scheduled\", or any workflow that runs unattended.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1783,1784,1785,1788],{"name":1772,"slug":1773,"type":13},{"name":8,"slug":8,"type":13},{"name":1786,"slug":1787,"type":13},"Operations","operations",{"name":21,"slug":22,"type":13},"2026-07-08T05:44:59.710099",14,{"items":1792,"total":1932},[1793,1810,1823,1834,1844,1855,1868,1885,1894,1906,1916,1926],{"slug":1794,"name":1794,"fn":1795,"description":1796,"org":1797,"tags":1798,"stars":1807,"repoUrl":1808,"updatedAt":1809},"config-evals","configure workflow evaluations","Builds and maintains configuration-based evaluations on a workflow with the eval-config tool. Use when the user asks to set up, add, view, change, or remove an evaluation, score, grade, or judge a workflow's output, or measure answer quality against a test dataset. This is the only eval form Instance AI handles — it does not touch on-canvas evaluation nodes.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1799,1802,1803,1806],{"name":1800,"slug":1801,"type":13},"Evals","evals",{"name":8,"slug":8,"type":13},{"name":1804,"slug":1805,"type":13},"Testing","testing",{"name":21,"slug":22,"type":13},198156,"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fn8n","2026-07-24T05:37:07.398695",{"slug":1811,"name":1811,"fn":1812,"description":1813,"org":1814,"tags":1815,"stars":1807,"repoUrl":1808,"updatedAt":1822},"credential-setup-with-computer-use","configure n8n credentials via browser","Guides n8n credential setup through Computer Use browser tools. Use when a user needs OAuth apps, API keys, client IDs, client secrets, or other credential values from an external service console.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1816,1817,1820,1821],{"name":15,"slug":16,"type":13},{"name":1818,"slug":1819,"type":13},"Configuration","configuration",{"name":8,"slug":8,"type":13},{"name":1743,"slug":1744,"type":13},"2026-06-30T07:40:45.54",{"slug":1824,"name":1824,"fn":1751,"description":1825,"org":1826,"tags":1827,"stars":1807,"repoUrl":1808,"updatedAt":1833},"data-table-manager","Load before calling data-tables or parse-file. Use for natural standalone requests like \"what data tables do I have?\", \"show\u002Flist my tables\", or \"what columns are in this table?\", and whenever the user asks to list, show, create, inspect, import, seed, query, update, clean up, rename columns in, or delete data tables and rows, especially from CSV\u002FXLSX\u002FJSON attachments. Also load before building or planning workflows that create or write to Data Tables (then load workflow-builder before build-workflow).",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1828,1831,1832],{"name":1829,"slug":1830,"type":13},"Data Engineering","data-engineering",{"name":1759,"slug":1760,"type":13},{"name":8,"slug":8,"type":13},"2026-07-27T06:07:14.648144",{"slug":1835,"name":1835,"fn":1836,"description":1837,"org":1838,"tags":1839,"stars":1807,"repoUrl":1808,"updatedAt":1822},"debugging-executions","debug failed n8n workflow executions","Debug failed or wrong-output workflow executions using executions tools. Load when the user reports execution failures, unexpected node output, empty parameter values after a successful run, or a node showing a red or failed expression error.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1840,1841,1842,1843],{"name":15,"slug":16,"type":13},{"name":1772,"slug":1773,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},{"slug":1845,"name":1845,"fn":1846,"description":1847,"org":1848,"tags":1849,"stars":1807,"repoUrl":1808,"updatedAt":1854},"intent-recognition","classify automation requests by control flow","Classifies automation requests using two decisions: anchor (which primitive owns the top-level control flow — workflow-anchored, agent-anchored, needs-clarification, or out-of-scope) and embeds_other (whether the other primitive appears embedded inside — an agent step inside a workflow, or a workflow invoked as an agent tool). Must be used before deciding the intent of any automation request, including compound requests with multiple independent automations, mid-build extensions to an existing workflow or agent, one-off questions or reports that need external systems you cannot query directly, and requests that need clarification before an anchor can be chosen, before choosing workflow-builder, planning, or an agent-oriented design.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1850,1851,1852,1853],{"name":1695,"slug":1696,"type":13},{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-30T05:30:06.772347",{"slug":1856,"name":1856,"fn":1857,"description":1858,"org":1859,"tags":1860,"stars":1807,"repoUrl":1808,"updatedAt":1867},"n8n-cli","manage n8n workflows from the CLI","Use the n8n CLI to manage workflows, credentials, executions, and more on an n8n instance. Use when the user asks to interact with n8n, automate workflows, manage credentials, or operate their instance from the command line.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1861,1862,1865,1866],{"name":15,"slug":16,"type":13},{"name":1863,"slug":1864,"type":13},"CLI","cli",{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-04-06T18:38:40.360123",{"slug":1869,"name":1869,"fn":1870,"description":1871,"org":1872,"tags":1873,"stars":1807,"repoUrl":1808,"updatedAt":1884},"n8n-docs-assistant","retrieve n8n documentation and guidance","Answers n8n product, setup, credential, node, hosting, API, and usage questions from current n8n docs. Load n8n-docs via load_tool before calling it (search \"n8n docs\" if not visible). Use when the user asks how to configure, set up, troubleshoot, or understand n8n behavior, especially credential setup questions opened from the credential modal.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1874,1877,1878,1881],{"name":1875,"slug":1876,"type":13},"Documentation","documentation",{"name":8,"slug":8,"type":13},{"name":1879,"slug":1880,"type":13},"Reference","reference",{"name":1882,"slug":1883,"type":13},"Search","search","2026-07-27T06:07:15.692906",{"slug":1886,"name":1886,"fn":1887,"description":1888,"org":1889,"tags":1890,"stars":1807,"repoUrl":1808,"updatedAt":1822},"planned-task-runtime","manage n8n task runtimes","Handles system follow-up turns: planned-task-follow-up (synthesize, replan, build-workflow, checkpoint), background-task-completed, running-tasks context, and create-tasks silence rules. Load whenever any of these tags appear or after calling create-tasks.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1891,1892,1893],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},{"slug":1895,"name":1895,"fn":1896,"description":1897,"org":1898,"tags":1899,"stars":1807,"repoUrl":1808,"updatedAt":1905},"planning","coordinate multi-artifact workflows","ONLY for coordinated multi-artifact work: multiple workflows with dependencies, shared data-table schema\u002Fmigration across tasks, or the user explicitly asked to review a plan first. Load create-tasks via load_tool before calling it (search \"create tasks\" if not visible). Do NOT use for new one-off workflows, single-workflow edits, verification-only requests, or standalone data-table ops — use workflow-builder or data-table-manager instead.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1900,1901,1902,1904],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":1903,"slug":1895,"type":13},"Planning",{"name":21,"slug":22,"type":13},"2026-07-27T06:07:16.673218",{"slug":1907,"name":1907,"fn":1908,"description":1909,"org":1910,"tags":1911,"stars":1807,"repoUrl":1808,"updatedAt":1915},"post-build-flow","verify and set up n8n workflows","Handles workflow verification and setup after build-workflow succeeds, or when the message contains workflow-verification-follow-up or workflow-setup-required. Load after direct builds, when verificationReadiness requires action, or on orchestrator verify\u002Fsetup follow-up turns.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1912,1913,1914],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-24T05:37:08.421329",{"slug":1917,"name":1917,"fn":1918,"description":1919,"org":1920,"tags":1921,"stars":1807,"repoUrl":1808,"updatedAt":1925},"workflow-builder","build and edit n8n workflows","Load before calling build-workflow. Default path for all single-workflow work: new one-off workflows, existing-workflow edits, verification repairs, and workflow-local data tables. Write or edit a workspace source file, then call build-workflow with filePath. When the workflow creates or writes Data Tables, load data-table-manager first, then this skill. Do not load planning or create-tasks first. Load planning only when multiple coordinated workflows or shared cross-task data tables require a dependency-aware task graph.",{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1922,1923,1924],{"name":15,"slug":16,"type":13},{"name":8,"slug":8,"type":13},{"name":21,"slug":22,"type":13},"2026-07-30T05:30:07.798011",{"slug":1689,"name":1689,"fn":1690,"description":1691,"org":1927,"tags":1928,"stars":23,"repoUrl":24,"updatedAt":1701},{"slug":8,"name":8,"logoUrl":9,"githubOrg":10},[1929,1930,1931],{"name":1695,"slug":1696,"type":13},{"name":1698,"slug":1699,"type":13},{"name":21,"slug":22,"type":13},25]