{
  "name": "Discover hidden website API endpoints using regex and AI",
  "nodes": [
    {
      "id": "cf0b4351-ccd5-409f-bc96-7ac1ae645b47",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3080,
        1820
      ],
      "parameters": {
        "width": 800,
        "height": 520,
        "content": "# Validation tool: the AI agent self-evaluates and iteratively improves "
      }
    },
    {
      "id": "d80057fc-912b-4aa1-97df-3ad8e93e168e",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        520
      ],
      "parameters": {
        "width": 1540,
        "height": 420,
        "content": "# 1. API Endpoints Extraction With a Predefined Regex  \n* Paste the **URL** of the target website into the **URL** field of the **Configuration** node.\n* Fetch the **HTML page** of the site and extrac"
      }
    },
    {
      "id": "ba232bb7-8b9f-4ad4-bc10-25c997728c8a",
      "name": "Auto-fixing Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserAutofixing",
      "position": [
        3320,
        1500
      ]
    },
    {
      "id": "a6d848f2-c1d4-40b2-8f69-55425c6d9843",
      "name": "Start API Discovery",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        980
      ]
    },
    {
      "id": "1003b136-9567-4498-8113-0ad1726bc41e",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        180,
        980
      ]
    },
    {
      "id": "62735481-3571-4df2-8c3d-afe20a1703b8",
      "name": "Fetch Website HTML",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        360,
        980
      ]
    },
    {
      "id": "f72069a0-28ee-42a8-9400-f64601beb609",
      "name": "Extract URLs of JS files",
      "type": "n8n-nodes-base.html",
      "position": [
        540,
        980
      ]
    },
    {
      "id": "d1d12617-779b-4afa-b9fb-a9a98870c60f",
      "name": "Split URLs of JS files",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        720,
        980
      ]
    },
    {
      "id": "794b8871-2fc9-4e46-8eee-6579cbcad8c8",
      "name": "Keep Relevant JS Files",
      "type": "n8n-nodes-base.filter",
      "position": [
        900,
        980
      ]
    },
    {
      "id": "d3aeef5a-98ad-49cc-abc0-6fa8d8f73783",
      "name": "Fetch JS Content",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1080,
        980
      ]
    },
    {
      "id": "30de7d2a-86f7-4de4-92f6-cc9387432407",
      "name": "Extract API Endpoints",
      "type": "n8n-nodes-base.set",
      "position": [
        1260,
        980
      ]
    },
    {
      "id": "da398951-fda2-40d3-a38e-e83ae9a9dfeb",
      "name": "Check Endpoints Count",
      "type": "n8n-nodes-base.if",
      "position": [
        1440,
        980
      ]
    },
    {
      "id": "2a4e5d2e-fcac-4f29-b042-0e6287b636c5",
      "name": "Split Endpoints",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1640,
        980
      ]
    },
    {
      "id": "53ebcbf7-1ba8-4a98-8a9e-ff73537c4ebe",
      "name": "Remove Duplicates",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        1800,
        980
      ]
    },
    {
      "id": "316b5b26-a96a-427f-9d20-8391a1c24bb5",
      "name": "AI Endpoints Analysis",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1820,
        1160
      ]
    },
    {
      "id": "0449852b-015a-4e2e-b096-5dceb3c64b6c",
      "name": "Add Source Metadata",
      "type": "n8n-nodes-base.set",
      "position": [
        2000,
        1160
      ]
    },
    {
      "id": "c4ef28ed-ff34-41c1-a237-40f1c3a1efba",
      "name": "Reference for Source Metadata",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1640,
        1160
      ]
    },
    {
      "id": "286e733f-a42d-4c87-b253-cff48170e91a",
      "name": "Process Each Analyzed File",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1640,
        1480
      ]
    },
    {
      "id": "ac9fca2a-6d2e-44ae-b2be-e9aad7f89e9b",
      "name": "Format AI Results",
      "type": "n8n-nodes-base.set",
      "position": [
        1820,
        1480
      ]
    },
    {
      "id": "682bab5d-036d-40c2-aff7-1d844697517f",
      "name": "Prepare Endpoints File(s)",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        2000,
        1480
      ]
    },
    {
      "id": "fd93d79e-6477-4cf3-af4a-9d5ddecc3c93",
      "name": "Save Endpoints File(s)",
      "type": "n8n-nodes-base.readWriteFile",
      "position": [
        2180,
        1480
      ]
    },
    {
      "id": "5d04fe81-982c-4e07-826e-48f0afbabde6",
      "name": "Pass File Name, No Binary",
      "type": "n8n-nodes-base.set",
      "position": [
        2000,
        1340
      ]
    },
    {
      "id": "019b4248-b5ae-4a66-ba55-e05046e0f0bb",
      "name": "Merge AI Analysis & File Name",
      "type": "n8n-nodes-base.merge",
      "position": [
        2320,
        1260
      ]
    },
    {
      "id": "4988dbbb-b73b-409c-90cc-1902115ab760",
      "name": "Create Endpoints Regex With AI",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        3280,
        1260
      ]
    },
    {
      "id": "e976ce33-d4e7-48a7-9879-1679526cb9f3",
      "name": "Regex Generation LLM",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        3160,
        1560
      ]
    },
    {
      "id": "7d8618d9-7b3f-473e-99e9-932c89a0cf8b",
      "name": "Validate LLM Regex",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        3620,
        1480
      ]
    },
    {
      "id": "e794bc60-fef9-4c76-bb65-b8438eb80792",
      "name": "Parse AI Regex Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        3480,
        1680
      ]
    },
    {
      "id": "55aafb04-4cac-46d7-832e-91b99466f3c3",
      "name": "Regex Validation Start",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        3140,
        2040
      ]
    },
    {
      "id": "e30b3def-09c1-42c8-afbb-c1e0421146fb",
      "name": "Load Reference Endpoints",
      "type": "n8n-nodes-base.readWriteFile",
      "position": [
        3380,
        1940
      ]
    },
    {
      "id": "5ebb63c2-8a99-47f8-8ea4-87ff2aff674b",
      "name": "Extract Endpoints File Text",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        3600,
        1940
      ]
    },
    {
      "id": "47e010ce-38f0-4235-966d-ad604d0c079b",
      "name": "Merge Regex, File Name & Reference Endpoints",
      "type": "n8n-nodes-base.merge",
      "position": [
        3400,
        2160
      ]
    },
    {
      "id": "dbb3f828-a4e0-44de-b712-f1e6b8593b9a",
      "name": "Evaluate LLM Regex",
      "type": "n8n-nodes-base.set",
      "position": [
        3620,
        2160
      ]
    },
    {
      "id": "3fac22e4-4c2d-4f3e-b644-09ef9904cd26",
      "name": "Merge Initial AI Analysis & AI Agent Output",
      "type": "n8n-nodes-base.merge",
      "position": [
        3740,
        1140
      ]
    },
    {
      "id": "188a39a5-be2f-4646-9ff8-b35c676b909b",
      "name": "Prepare Data for Regex Extraction",
      "type": "n8n-nodes-base.set",
      "position": [
        3940,
        1140
      ]
    },
    {
      "id": "1c8926aa-98da-4868-b917-19bca53520a0",
      "name": "Execute LLM Regex",
      "type": "n8n-nodes-base.set",
      "position": [
        4120,
        1140
      ]
    },
    {
      "id": "fc403a6d-8e59-448e-8d31-f576dfacf53f",
      "name": "Split LLM-extracted Endpoints",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        4300,
        1140
      ]
    },
    {
      "id": "fe9477cf-7c65-461f-b053-a89b329361e1",
      "name": "Remove LLM Endpoints Duplicates",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        4500,
        1140
      ]
    },
    {
      "id": "40a6dd8a-2955-40d9-845d-43035ec04364",
      "name": "Merge Original And LLM Endpoints",
      "type": "n8n-nodes-base.merge",
      "position": [
        5000,
        1120
      ]
    },
    {
      "id": "87919c16-e0c2-4c60-8e78-4aa9f23736fa",
      "name": "Final Merge with Enriched File Name",
      "type": "n8n-nodes-base.merge",
      "position": [
        5200,
        1120
      ]
    },
    {
      "id": "c6039111-8f99-40d3-9d84-56674b53e74f",
      "name": "Sort Merged Endpoints",
      "type": "n8n-nodes-base.sort",
      "position": [
        5400,
        1120
      ]
    },
    {
      "id": "2fc96028-979c-4c52-85b1-fd4295e94354",
      "name": "Reorder Output Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        5580,
        1120
      ]
    },
    {
      "id": "b44b2577-e937-43ea-bdd5-403070caa50e",
      "name": "Export Comparison Results To Excel",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        5760,
        1120
      ]
    },
    {
      "id": "86dbcf40-3b36-48b7-94e6-ab5267c30ad9",
      "name": "Prepare Source & File Name for Merge",
      "type": "n8n-nodes-base.removeDuplicates",
      "position": [
        5200,
        1280
      ]
    },
    {
      "id": "0664e7ae-bcd9-4dde-93db-1572bfaa894e",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        0
      ],
      "parameters": {
        "width": 1540,
        "height": 520,
        "content": "# The workflow helps to automatically find hidden API endpoints in web platforms that don't provide public APIs by analysing their JavaScript code.\n ## Modern web applications often use internal API e"
      }
    },
    {
      "id": "1cffa311-ac2c-4746-aa2c-0c5194776861",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        20,
        760
      ],
      "parameters": {
        "width": 760,
        "height": 140,
        "content": "## Regex extracts all URL-like strings with API-focused filtering\n* Scans the code of each JS file for quoted URL strings\n* Captures relative, absolute URLs & internal routes\n* **Excludes:** static fi"
      }
    },
    {
      "id": "ceaec55d-5626-4724-b4ec-d5738ad23b57",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        20,
        220
      ],
      "parameters": {
        "width": 760,
        "height": 140,
        "content": "## The workflow is best suited for:\n* Knockout.js & Next.js/Nuxt.js applications with embedded API calls \n* SPA platforms that use fetch/axios to communicate with the backend\n* Modern web apps with bu"
      }
    },
    {
      "id": "5dc66bb7-3645-4959-a52e-73658f5fa09e",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        780,
        220
      ],
      "parameters": {
        "width": 740,
        "height": 140,
        "content": "## The workflow may not be suited for:\n* Dynamically generated endpoints (runtime build)\n* WebSocket only communication without REST endpoints\n* Fully obfuscated code\n* Server-side only architecture w"
      }
    },
    {
      "id": "8ad235ab-fdb5-4eee-bc5e-b0be081244ef",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        500,
        380
      ],
      "parameters": {
        "width": 580,
        "height": 120,
        "content": "## Requirements:\n* The target platform must embed API endpoints in JS as string literals \n* JS files must be accessible and not heavily obfuscated\n* The platform must use standard endpoint patterns (/"
      }
    },
    {
      "id": "05119e49-411f-440a-9765-4ec8e229e8b2",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2140,
        140
      ],
      "parameters": {
        "width": 1540,
        "height": 800,
        "content": "# 2. AI-supported API Endpoints Extraction  \n\n"
      }
    },
    {
      "id": "7896a8f2-2914-432c-ac04-856f1555d569",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2160,
        460
      ],
      "parameters": {
        "width": 700,
        "height": null,
        "content": "## Stage 2. LLM Regex Generation\n* Feed the analysis results from the 1st LLM to the 2nd LLM via the **Tools Agent**.\n* By default, **Claude 3.7 Sonnet** is used to generate regex.\n* The LLM creates c"
      }
    },
    {
      "id": "7b1d73c9-c7e1-4b75-8f1e-a08fcd76a577",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2160,
        640
      ],
      "parameters": {
        "width": 700,
        "height": 260,
        "content": "## Stage 3. LLM Regex Validation \n* The **Agent** calls the **Validation tool** which checks the LLM regex accuracy. \n* The **Validation tool** calls a sub-workflow to test the LLM regex against the r"
      }
    },
    {
      "id": "571233f3-0e25-455b-b7e6-3498721ef6d3",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2160,
        240
      ],
      "parameters": {
        "width": 700,
        "height": 200,
        "content": "## Stage 1. Initial AI Analysis\n* Send JS file content to **LLM** via the **OpenRouter API**.\n* LLM performs a comprehensive JS code analysis for each kept file to identify API endpoints with detailed"
      }
    },
    {
      "id": "ea7dd713-a97d-4a29-86d6-885a3c24a5cf",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3060,
        240
      ],
      "parameters": {
        "width": 520,
        "height": 180,
        "content": "## Warning!\n* The **Agent** does not generate regex in 100% of situations. Sometimes it gives the message **‘The Agent stopped due to max iterations’** or creates a regex which does not retrieve the r"
      }
    },
    {
      "id": "98bc1708-1617-4104-a66b-dadfec2dc384",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2900,
        740
      ],
      "parameters": {
        "width": 760,
        "height": null,
        "content": "## Stage 4. LLM Regex Execution\n* After the **Agent** node, merge the results of the 1st LLM and the **Agent** output. \n* Execute a final LLM regex on the output of the 1st LLM similar to how the **Va"
      }
    },
    {
      "id": "99853c4d-20d0-4465-ad6a-c97d1b83cb1e",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        5000,
        760
      ],
      "parameters": {
        "width": 860,
        "height": 200,
        "content": "# Final comparison \n* Combine endpoints from both extraction approaches (predefined regex + LLM extraction).\n* Add filename references to the combined result.\n* Sort and organise results for side-by-s"
      }
    },
    {
      "id": "1f0f991f-a180-4cc6-8ac7-bb7f16f6b755",
      "name": "Sticky Note15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        1160
      ],
      "parameters": {
        "width": 1540,
        "height": 500,
        "content": "\n\n\n\n\n\n\n* https://www.sofaconcerts.org (**Knockout.js framework**). A music booking platform and starting point for this workflow. The **Google AI Studio** model helped define **most relevant endpoints"
      }
    },
    {
      "id": "ff90a549-958d-4596-b9d1-c08ccb5ddefa",
      "name": "Sticky Note14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        1160
      ],
      "parameters": {
        "width": null,
        "height": 80,
        "content": "# Examples: "
      }
    },
    {
      "id": "6e821dac-803f-4ca6-9100-8cd5e42e97f3",
      "name": "Insufficient Endpoints",
      "type": "n8n-nodes-base.noOp",
      "position": [
        1640,
        800
      ]
    }
  ],
  "connections": {
    "Configuration": {
      "main": [
        [
          {
            "node": "Fetch Website HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Endpoints": {
      "main": [
        [
          {
            "node": "Remove Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch JS Content": {
      "main": [
        [
          {
            "node": "Extract API Endpoints",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute LLM Regex": {
      "main": [
        [
          {
            "node": "Split LLM-extracted Endpoints",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format AI Results": {
      "main": [
        [
          {
            "node": "Prepare Endpoints File(s)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Duplicates": {
      "main": [
        [
          {
            "node": "Merge Original And LLM Endpoints",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Website HTML": {
      "main": [
        [
          {
            "node": "Extract URLs of JS files",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate LLM Regex": {
      "ai_tool": [
        [
          {
            "node": "Create Endpoints Regex With AI",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Add Source Metadata": {
      "main": [
        [
          {
            "node": "Process Each Analyzed File",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge AI Analysis & File Name",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Start API Discovery": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Regex Generation LLM": {
      "ai_languageModel": [
        [
          {
            "node": "Create Endpoints Regex With AI",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Endpoints Analysis": {
      "main": [
        [
          {
            "node": "Add Source Metadata",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Endpoints Count": {
      "main": [
        [
          {
            "node": "Split Endpoints",
            "type": "main",
            "index": 0
          },
          {
            "node": "Reference for Source Metadata",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Insufficient Endpoints",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract API Endpoints": {
      "main": [
        [
          {
            "node": "Check Endpoints Count",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse AI Regex Output": {
      "ai_outputParser": [
        [
          {
            "node": "Auto-fixing Output Parser",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Reorder Output Fields": {
      "main": [
        [
          {
            "node": "Export Comparison Results To Excel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sort Merged Endpoints": {
      "main": [
        [
          {
            "node": "Reorder Output Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Keep Relevant JS Files": {
      "main": [
        [
          {
            "node": "Fetch JS Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Regex Validation Start": {
      "main": [
        [
          {
            "node": "Load Reference Endpoints",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Regex, File Name & Reference Endpoints",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Save Endpoints File(s)": {
      "main": [
        [
          {
            "node": "Process Each Analyzed File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split URLs of JS files": {
      "main": [
        [
          {
            "node": "Keep Relevant JS Files",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract URLs of JS files": {
      "main": [
        [
          {
            "node": "Split URLs of JS files",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Load Reference Endpoints": {
      "main": [
        [
          {
            "node": "Extract Endpoints File Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Auto-fixing Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Create Endpoints Regex With AI",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Pass File Name, No Binary": {
      "main": [
        [
          {
            "node": "Merge AI Analysis & File Name",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Endpoints File(s)": {
      "main": [
        [
          {
            "node": "Save Endpoints File(s)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Each Analyzed File": {
      "main": [
        [
          {
            "node": "Pass File Name, No Binary",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Format AI Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Endpoints File Text": {
      "main": [
        [
          {
            "node": "Merge Regex, File Name & Reference Endpoints",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge AI Analysis & File Name": {
      "main": [
        [
          {
            "node": "Merge Initial AI Analysis & AI Agent Output",
            "type": "main",
            "index": 0
          },
          {
            "node": "Create Endpoints Regex With AI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Reference for Source Metadata": {
      "main": [
        [
          {
            "node": "AI Endpoints Analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split LLM-extracted Endpoints": {
      "main": [
        [
          {
            "node": "Remove LLM Endpoints Duplicates",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Endpoints Regex With AI": {
      "main": [
        [
          {
            "node": "Merge Initial AI Analysis & AI Agent Output",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Remove LLM Endpoints Duplicates": {
      "main": [
        [
          {
            "node": "Merge Original And LLM Endpoints",
            "type": "main",
            "index": 1
          },
          {
            "node": "Prepare Source & File Name for Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Original And LLM Endpoints": {
      "main": [
        [
          {
            "node": "Final Merge with Enriched File Name",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Data for Regex Extraction": {
      "main": [
        [
          {
            "node": "Execute LLM Regex",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Final Merge with Enriched File Name": {
      "main": [
        [
          {
            "node": "Sort Merged Endpoints",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Source & File Name for Merge": {
      "main": [
        [
          {
            "node": "Final Merge with Enriched File Name",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Merge Initial AI Analysis & AI Agent Output": {
      "main": [
        [
          {
            "node": "Prepare Data for Regex Extraction",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Regex, File Name & Reference Endpoints": {
      "main": [
        [
          {
            "node": "Evaluate LLM Regex",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}