{
  "id": "NUa98k47BO1lo5iLgz-J7",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Extract URLs From Sitemaps",
  "tags": [
    {
      "id": "cl7hSwyoDY6BEYfE",
      "name": "Sitemap",
      "createdAt": "2026-04-18T16:38:36.214Z",
      "updatedAt": "2026-04-18T16:38:36.214Z"
    }
  ],
  "nodes": [
    {
      "id": "557f84b3-8502-417a-898d-76c41bd7175b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -400,
        160
      ],
      "parameters": {
        "color": 3,
        "width": 1382,
        "height": 736,
        "content": "## \ud83d\udce5 1. Input & Validation\nListens for user chat input, fetches the sitemap URL, and validates if the domain is correctly formatted and accessible."
      },
      "typeVersion": 1
    },
    {
      "id": "3651fac9-ba8e-409c-a57f-9eb17f1cd772",
      "name": "Sticky Note 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        -320
      ],
      "parameters": {
        "color": 2,
        "width": 1360,
        "height": 786,
        "content": "## \u2699\ufe0f 2. XML Parsing & Transformation\nConverts the raw XML to JSON, checks if it is a sitemap index, splits the relevant URLs, and maps the fields for data export."
      },
      "typeVersion": 1
    },
    {
      "id": "097888c1-2e15-4b5c-880f-0097688d8a6b",
      "name": "Sticky Note 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2560,
        32
      ],
      "parameters": {
        "color": 6,
        "width": 2300,
        "height": 1106,
        "content": "## \ud83d\udce6 3. File Packaging & Upload\nConverts the extracted data into a sanitized binary file, uploads it to the temporary API host, and returns the final download link to the user."
      },
      "typeVersion": 1
    },
    {
      "id": "028e0f33-b6e9-4ff5-9440-67a1a1f3ed70",
      "name": "Sticky Note README",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1232,
        128
      ],
      "parameters": {
        "color": 7,
        "width": 800,
        "height": 300,
        "content": "## \ud83d\udcd6 README: Sitemap URL Extractor\n\n**What this tool does:**\nThis automated chat assistant fetches, parses, and extracts all nested URLs from any website's XML sitemap. It converts the raw XML data into a clean, structured file and generates a temporary, one-click download link.\n\n**How to use it:**\n1. **Input:** The user opens the chat window and pastes a valid sitemap URL (e.g., `https://seobatter.com/page-sitemap.xml`).\n2. **Process:** The workflow automatically validates the domain, fetches the XML, flattens the hierarchy, and extracts the target URLs.\n3. **Output:** The data is compiled into a downloadable file and uploaded to a temporary host. The user receives the secure download link directly in the chat."
      },
      "typeVersion": 1
    },
    {
      "id": "65838709-c4e6-4c84-b678-4eaccbe762dc",
      "name": "Sticky Note Limitations",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1104,
        496
      ],
      "parameters": {
        "color": 6,
        "width": 550,
        "height": 364,
        "content": "## \u26a0\ufe0f Dependencies & Limitations\n\n**1. Direct Sitemaps Only:**\nThis workflow is designed to parse standard XML sitemaps containing direct page links (`<url>`). **It does not recursively crawl Sitemap Index files** (`<sitemapindex>`). If a user inputs an index URL, they must manually provide the underlying child sitemap URLs instead.\n\n**2. Third-Party File Hosting:**\nThis workflow relies on an external, public API (e.g., Uguu, Catbox.moe, Tmpfiles) to host the final file. If that third-party service experiences downtime or changes its CORS/filetype policies, the final upload node will fail.\n\n**3. Memory Constraints:**\nExtremely large sitemaps (e.g., 50,000+ URLs) may exceed n8n's default memory limits during the XML-to-JSON conversion step. This tool is best suited for standard-sized sitemaps."
      },
      "typeVersion": 1
    },
    {
      "id": "c19716a6-7397-4fe3-b627-e50e254a382a",
      "name": "Listen for Sitemap URL",
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "notes": "example url: https://seobatter.com/page-sitemap.xml",
      "position": [
        -304,
        304
      ],
      "parameters": {
        "options": {
          "responseMode": "responseNodes"
        }
      },
      "notesInFlow": true,
      "typeVersion": 1.4
    },
    {
      "id": "be408a08-e781-489a-b59a-23adcc552f4b",
      "name": "Fetch Sitemap XML",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueErrorOutput",
      "maxTries": 5,
      "position": [
        32,
        304
      ],
      "parameters": {
        "url": "={{ $json.chatInput }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": true
            }
          }
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.3,
      "waitBetweenTries": 3000
    },
    {
      "id": "3b6b8e80-59f3-4894-b99a-8510fadc8850",
      "name": "Check if URL is Accessible",
      "type": "n8n-nodes-base.if",
      "position": [
        400,
        288
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "1125f0dc-f7f6-4c92-bb8b-73ee8ec4c01a",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.statusCode }}",
              "rightValue": 200
            }
          ]
        }
      },
      "executeOnce": true,
      "typeVersion": 2.3
    },
    {
      "id": "bd576d6a-8cf1-4d0d-a41b-d2a7791c7b12",
      "name": "Alert User: Invalid URL",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        800,
        416
      ],
      "parameters": {
        "message": "Please enter a valid sitemap or sitemap index URL. Example: \"https://seobatter.com/post-sitemap.xml\"",
        "options": {},
        "waitUserReply": false
      },
      "typeVersion": 1
    },
    {
      "id": "c6150cc9-2834-4df3-8271-1d4ac397baba",
      "name": "Parse XML to JSON Object",
      "type": "n8n-nodes-base.xml",
      "position": [
        1232,
        272
      ],
      "parameters": {
        "options": {},
        "dataPropertyName": "=data"
      },
      "typeVersion": 1
    },
    {
      "id": "19c890d0-f476-44bf-9bdc-87f971e8d6e2",
      "name": "Check for Sitemap Index",
      "type": "n8n-nodes-base.if",
      "position": [
        1552,
        272
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "98129e08-b536-492d-8cc6-e13bda990c00",
              "operator": {
                "type": "object",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.sitemapindex }}",
              "rightValue": "sitemapindex"
            },
            {
              "id": "a3bd9947-a125-4271-b2b1-7df86e6a5b06",
              "operator": {
                "type": "object",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{$json.urlset}}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "1e01292f-c322-410d-8194-bf23d23628ad",
      "name": "Alert User: Index Not Supported",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        1888,
        192
      ],
      "parameters": {
        "message": "The URL that you've entered is a sitemap index. Please start the process again and entry a sitemap.xml URL.",
        "options": {},
        "waitUserReply": false
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "fb3d8c43-77b7-4350-9aea-55187d0694de",
      "name": "Extract URLs Array",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        2240,
        288
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "urlset.url"
      },
      "typeVersion": 1
    },
    {
      "id": "273eb943-80d5-42e1-b76e-f60345d3c7f9",
      "name": "Format URL Data",
      "type": "n8n-nodes-base.set",
      "position": [
        2672,
        288
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "227739b0-b655-4d6b-a7e8-cd86c5452dc3",
              "name": "loc",
              "type": "string",
              "value": "={{ $json.loc }}"
            },
            {
              "id": "074578ef-ecd0-434c-a2f5-4ba75aeaadc9",
              "name": "lastmod",
              "type": "string",
              "value": "={{ $json.lastmod }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2382f0ee-13df-4f57-8922-70b6215f77b5",
      "name": "Convert Data to CSV",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        3184,
        544
      ],
      "parameters": {
        "options": {
          "headerRow": true
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "3926bd43-c5e5-4aff-bff1-9552ad20e135",
      "name": "Upload File to Host",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueErrorOutput",
      "position": [
        3568,
        544
      ],
      "parameters": {
        "url": "https://uguu.se/upload",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "name": "output",
              "value": "csv"
            },
            {
              "name": "files[]",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "data"
            }
          ]
        }
      },
      "typeVersion": 4.3,
      "alwaysOutputData": false
    },
    {
      "id": "b7e236de-bb2e-43b7-8cbc-6f0b8b715986",
      "name": "Format Final Output",
      "type": "n8n-nodes-base.code",
      "position": [
        4288,
        528
      ],
      "parameters": {
        "jsCode": "const url = $json.files?.[0]?.url;\n\nreturn [\n  {\n    json: {\n      message: `<${url}>`\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "fb2c1b08-5c1c-4955-b0d4-00f3575ecf4c",
      "name": "Send Download Link",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "onError": "continueRegularOutput",
      "position": [
        4624,
        528
      ],
      "parameters": {
        "message": "=Download your file here:\n{{ $json.message }}\n\n",
        "options": {},
        "waitUserReply": false
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "08c50262-1a52-4e25-8eb0-44843d105dc4",
      "name": "Summarize Extraction Stats",
      "type": "n8n-nodes-base.summarize",
      "position": [
        3056,
        384
      ],
      "parameters": {
        "options": {},
        "fieldsToSummarize": {
          "values": [
            {
              "field": "=loc"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "3802bf90-7349-4037-977c-b4c9b53c2403",
      "name": "Send Summary",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "onError": "continueRegularOutput",
      "position": [
        3488,
        384
      ],
      "parameters": {
        "message": "=Total number of URLs: {{ $json.count_loc }}\n\n",
        "options": {},
        "waitUserReply": false
      },
      "executeOnce": true,
      "typeVersion": 1
    },
    {
      "id": "d64f5296-60d8-422c-b956-40e79415cdd5",
      "name": "Alert User: Upload Failed",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        3952,
        656
      ],
      "parameters": {
        "message": "The output resulted in an error. Please try again or ask the administrator to update the workflow.",
        "options": {}
      },
      "typeVersion": 1
    },
    {
      "id": "15596616-cfdd-4129-8c93-c3b7995c7e94",
      "name": "Sticky Note - Node 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -384,
        448
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 340,
        "content": "### \ud83d\udcac Listen for Sitemap URL\n\n**What it does:**\nActs as the workflow's entry point. It opens the built-in n8n chat interface and listens for the user to submit a text message (the sitemap URL).\n\n**Configuration:**\nStandard Chat Trigger node configured to capture the `chatInput` string.\n\n**Limitation:**\n* It accepts any text string; URL format validation has to be handled by downstream nodes."
      },
      "typeVersion": 1
    },
    {
      "id": "2836f0f6-5012-452f-a6df-a92785d8b44b",
      "name": "Sticky Note - Node 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        448
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 290,
        "content": "### \ud83c\udf10 Fetch Sitemap XML\n\nMakes an HTTP GET request to download the raw XML sitemap data from the user-provided URL.\n\n**Configuration:**\n* **Method:** `GET`\n* **URL:** Mapped to chat input\n* **Response Format:** `String` *(Crucial: Prevents n8n from prematurely parsing the XML so it can be cleaned).*"
      },
      "typeVersion": 1
    },
    {
      "id": "adeb3748-1678-488b-9fbb-2e27e64823a3",
      "name": "Sticky Note - Node 3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        448
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 278,
        "content": "### \ud83d\udea6 Check if URL is Accessible\n\nVerifies the HTTP Request was successful by checking the server's exact response code. Routes to 'True' for a successful fetch, and 'False' for any errors to halt the workflow.\n\n**Configuration:**\n* **Node Type:** IF\n* **Setup:** Checks if the returned HTTP Status Code equals `200`."
      },
      "typeVersion": 1
    },
    {
      "id": "f2a6f86b-eba9-4c13-9560-d211872897aa",
      "name": "Sticky Note - Node 4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        656,
        560
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 280,
        "content": "### \ud83d\uded1 Alert User: Invalid URL\n\nSends an error message to the chat when the website returns an HTTP status code other than `200` (e.g., 404 Not Found, 500 Server Error), effectively stopping the workflow.\n\n**Configuration:**\n* **Node Type:** Chat Response\n* **Setup:** Contains a friendly, hardcoded error message explaining the failure."
      },
      "typeVersion": 1
    },
    {
      "id": "30e137e8-a21a-41df-99e6-5c9e015117db",
      "name": "Sticky Note - Node 5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        -16
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 256,
        "content": "### \ud83d\udd23 Parse XML to JSON Object\n\nConverts the successfully downloaded raw XML text string into a structured JSON object. This translates the payload so the workflow can easily check for index files and extract the nested URLs.\n\n**Configuration:**\n* **Node Type:** XML\n* **Mode:** XML to JSON"
      },
      "typeVersion": 1
    },
    {
      "id": "a25157e8-a6cd-4a44-b5f3-5cc1f19638a7",
      "name": "Sticky Note - Node 7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1776,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 300,
        "content": "### \ud83d\uded1 Alert User: Index Not Supported\n\nSends an error message to the chat when the parsed XML is identified as a Sitemap Index (`<sitemapindex>`) rather than a standard URL list, stopping the workflow since recursive crawling is not supported.\n\n**Configuration:**\n* **Node Type:** Chat Response\n* **Setup:** Hardcoded error message instructing the user to provide direct child sitemap URLs instead."
      },
      "typeVersion": 1
    },
    {
      "id": "d872ece0-176e-4377-b9e6-3b81bd0fec83",
      "name": "Sticky Note - Node 6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1440,
        -96
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 352,
        "content": "### \ud83d\udd00 Check for Sitemap Index\n\nExamines the parsed JSON data to determine if the root element is a `<sitemapindex>` instead of a standard `<urlset>`. This ensures the workflow only attempts to extract URLs from standard sitemaps and catches nested indices before they break the workflow.\n\n**Configuration:**\n* **Node Type:** IF\n* **Setup:** Checks if the JSON key `sitemapindex` exists. Routes to 'True' (error path) if found, and 'False' (continue path) if not."
      },
      "typeVersion": 1
    },
    {
      "id": "661543e6-9335-49d3-9b99-27707233cc74",
      "name": "Sticky Note - Node 8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2112,
        -48
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 300,
        "content": "### \ud83d\udccb Extract URLs Array\n\nIsolates the list of URLs from the parsed JSON and splits them into individual n8n items. This converts the single block of XML data into a list of separate, processable links that the workflow can format and export.\n\n**Configuration:**\n* **Node Type:** Item Lists\n* **Setup:** Configured to target and split out the specific JSON array containing the page URLs (usually `urlset.url`)."
      },
      "typeVersion": 1
    },
    {
      "id": "0c204d2a-7490-4ea2-ab9a-3c182d02a03e",
      "name": "Sticky Note - Node 9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2576,
        448
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 300,
        "content": "### \ud83e\uddf9 Format URL Data\n\nProcesses the extracted array of URLs, cleaning and mapping the raw data into a standardized structure. This ensures the data is perfectly formatted before being converted into the final export file.\n\n**Configuration:**\n* **Node Type:** Edit Fields / Code\n* **Setup:** Maps and isolates the specific URL properties (like the `<loc>` tag) needed for the final output."
      },
      "typeVersion": 1
    },
    {
      "id": "d72d3aa3-a9e5-4f09-8c0b-3ebc48fcd25f",
      "name": "Sticky Note - Node 10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2928,
        144
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 232,
        "content": "### \ud83d\udcca Summarize Extraction Stats\n\nAggregates the processed data to calculate the total number of extracted URLs. This provides the user with a quick success metric.\n\n**Configuration:**\n* **Node Type:** Summarize\n* **Setup:** Counts the total number of items passed from the formatting step."
      },
      "typeVersion": 1
    },
    {
      "id": "c453a30b-5df6-4c19-b7a1-ed67dc1cfd81",
      "name": "Sticky Note - Node 11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3344,
        144
      ],
      "parameters": {
        "color": 7,
        "width": 352,
        "height": 228,
        "content": "### \ud83d\udcac Send Summary\n\nSends a chat message to the user displaying the total number of URLs successfully extracted.\n\n**Configuration:**\n* **Node Type:** Chat Response\n* **Setup:** Outputs the aggregated count from the Summarize node."
      },
      "typeVersion": 1
    },
    {
      "id": "5847a128-7846-46e6-a606-f20b737160ad",
      "name": "Sticky Note - Node 12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3104,
        704
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 260,
        "content": "### \ud83d\udcc4 Convert Data to CSV\n\nConverts the structured JSON data into a clean CSV file format, preparing it for the final file upload.\n\n**Configuration:**\n* **Node Type:** Convert to CSV / Spreadsheet File\n* **Setup:** Transforms the extracted items into a binary CSV payload."
      },
      "typeVersion": 1
    },
    {
      "id": "47b4408b-b6c8-410b-928e-d2666705ff2d",
      "name": "Sticky Note - Node 13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3472,
        704
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 304,
        "content": "### \ud83c\udf10 Upload File to Host\n\nTakes the generated CSV file and uploads it to a temporary third-party file hosting service via an API request. This step generates the publicly accessible URL that the user will use to download their data.\n\n**Configuration:**\n* **Node Type:** HTTP Request\n* **Setup:** Sends a `POST` request containing the binary CSV file to the hosting service (e.g., Uguu) using a multipart/form-data payload."
      },
      "typeVersion": 1
    },
    {
      "id": "b246f3eb-a7a9-4848-84fe-f3ef51432d00",
      "name": "Sticky Note - Node 14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4192,
        672
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 296,
        "content": "### \ud83d\udd24 Format Final Output\n\nExtracts the public file URL from the hosting provider's API response and formats it into a clean string. This translates the raw upload data from the previous step into a perfect, clickable download link so the final chat node can easily present it to the user.\n\n**Configuration:**\n* **Node Type:** Set / Edit Fields\n* **Setup:** Isolates the newly generated file URL from the HTTP upload response."
      },
      "typeVersion": 1
    },
    {
      "id": "b641d9dd-ace0-4844-bff5-f266fc08748b",
      "name": "Sticky Note - Node 15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4528,
        672
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 280,
        "content": "### \ud83d\udcac Send Download Link\n\nSends the final chat message to the user containing the clickable public URL generated in the previous step, allowing them to easily download their extracted sitemap data.\n\n**Configuration:**\n* **Node Type:** Chat Response\n* **Setup:** Outputs a message embedding the formatted download URL."
      },
      "typeVersion": 1
    },
    {
      "id": "4809d4b8-d912-4d58-9e3a-2448697798ef",
      "name": "Sticky Note - Node 16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3872,
        800
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 316,
        "content": "### \ud83d\uded1 Alert User: Upload Failed\n\nSends a chat message informing the user that the final file upload failed, effectively halting the workflow. This triggers if the third-party hosting service is down or rejects the CSV payload, letting the user know why they won't receive a download link.\n\n**Configuration:**\n* **Node Type:** Chat Response\n* **Setup:** Contains a friendly, hardcoded error message explaining the upload failure."
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "49d60cdd-6dd9-4a32-a158-0cdd44c2eb21",
  "connections": {
    "Format URL Data": {
      "main": [
        [
          {
            "node": "Summarize Extraction Stats",
            "type": "main",
            "index": 0
          },
          {
            "node": "Convert Data to CSV",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Sitemap XML": {
      "main": [
        [
          {
            "node": "Check if URL is Accessible",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Alert User: Invalid URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract URLs Array": {
      "main": [
        [
          {
            "node": "Format URL Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Download Link": {
      "main": [
        []
      ]
    },
    "Convert Data to CSV": {
      "main": [
        [
          {
            "node": "Upload File to Host",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Final Output": {
      "main": [
        [
          {
            "node": "Send Download Link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload File to Host": {
      "main": [
        [
          {
            "node": "Format Final Output",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Alert User: Upload Failed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Listen for Sitemap URL": {
      "main": [
        [
          {
            "node": "Fetch Sitemap XML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Alert User: Invalid URL": {
      "main": [
        []
      ]
    },
    "Check for Sitemap Index": {
      "main": [
        [
          {
            "node": "Alert User: Index Not Supported",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Extract URLs Array",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse XML to JSON Object": {
      "main": [
        [
          {
            "node": "Check for Sitemap Index",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check if URL is Accessible": {
      "main": [
        [
          {
            "node": "Parse XML to JSON Object",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Alert User: Invalid URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summarize Extraction Stats": {
      "main": [
        [
          {
            "node": "Send Summary",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}