{
  "id": "N9457WJd3lloMiYa",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Audit browser fingerprint and IP integrity to Slack reports",
  "tags": [],
  "nodes": [
    {
      "id": "c7c2d0e6-15bf-4c12-b948-3fff1b811557",
      "name": "Define Target URLs",
      "type": "n8n-nodes-base.set",
      "notes": "Define your 10 target sites here.",
      "position": [
        240,
        512
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "url_list",
              "name": "urls",
              "type": "array",
              "value": "=[\n\"https://www.browserscan.net/bot-detection\",\n\"https://www.ipqualityscore.com/free-ip-lookup-proxy-vpn-test\",\n\"https://www.ip-score.com/\"\n]"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "6a10f043-366b-48b9-b569-5217f8173480",
      "name": "Loop Over URLs",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        816,
        512
      ],
      "parameters": {
        "options": {
          "reset": false
        }
      },
      "typeVersion": 3
    },
    {
      "id": "fa5dc98c-e13f-414b-81c2-6a1dc42c4935",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        464,
        512
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "urls"
      },
      "typeVersion": 1
    },
    {
      "id": "2f9fc698-9542-411b-8efc-8be4aa98980c",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1216,
        704
      ],
      "parameters": {
        "model": "openai/gpt-4o",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "6707e5c4-2722-4eea-b12c-3c536e669b07",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1344,
        720
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n  \"text\": \"# \ud83d\udee1\ufe0f SECURITY DIAGNOSTIC REPORT\\n\\n[Your detailed markdown report here...]\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "c8a3cc28-08fb-4aa3-bce1-52d698a45ae5",
      "name": "OpenRouter Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        2784,
        608
      ],
      "parameters": {
        "model": "openai/gpt-4o",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f7f86ab6-50b8-4f97-8b93-4fef8e4b16d3",
      "name": "Structured Output Parser1",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2928,
        608
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n  \"text\": \"\ud83d\udee1\ufe0f SECURITY DIAGNOSTIC REPORT\\n\\n1. EXECUTIVE SUMMARY\\n- Status: PASS\\n- Verdict: The browser environment appears stealthy. WebDriver is hidden and no automation flags were detected.\\n\\n2. DETECTED LEAKS\\n- None detected. Plugin length is 5, which is consistent with a human user.\\n\\n3. NETWORK IDENTITY\\n- Visible IP: Not present in logs\\n- Location: Unknown\\n\\n4. FINGERPRINT DETAILS\\n- Browser Engine: Chrome 139.0.0.0\\n- User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...\\n- WebGL Vendor: Google Inc. (Intel)\\n\\n5. RAW EVIDENCE\\n- \\\"WebDriver (New) | missing (passed)\\\"\\n- \\\"Canvas Hash: 1165917394\\\"\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "f6601732-864e-449f-bc46-8b7f0f50574a",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2656,
        384
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "5bb81487-96bc-46bb-b8e1-218ab402fb35",
      "name": "Structured Output Parser2",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1648,
        400
      ],
      "parameters": {
        "autoFix": true,
        "jsonSchemaExample": "{\n  \"text\": \"\ud83d\udee1\ufe0f SECURITY DIAGNOSTIC REPORT\\n\\n1. EXECUTIVE SUMMARY\\n- Status: PASS\\n- Verdict: The browser environment appears stealthy. WebDriver is hidden and no automation flags were detected.\\n\\n2. DETECTED LEAKS\\n- None detected. Plugin length is 5, which is consistent with a human user.\\n\\n3. NETWORK IDENTITY\\n- Visible IP: Not present in logs\\n- Location: Unknown\\n\\n4. FINGERPRINT DETAILS\\n- Browser Engine: Chrome 139.0.0.0\\n- User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...\\n- WebGL Vendor: Google Inc. (Intel)\\n\\n5. RAW EVIDENCE\\n- \\\"WebDriver (New) | missing (passed)\\\"\\n- \\\"Canvas Hash: 1165917394\\\"\"\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e9bf86eb-0b46-4792-8b3f-189f41512359",
      "name": "Clear Database",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        16,
        512
      ],
      "parameters": {
        "operation": "clear",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU/edit#gid=0",
          "cachedResultName": "DataBase"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU/edit?usp=drivesdk",
          "cachedResultName": "IP, Fingerprint Integrity and Bot Detection Check"
        },
        "keepFirstRow": true
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "ff3dc30e-d67a-4ea0-b4db-47280322e53f",
      "name": "Execute manually",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -208,
        512
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "da9c8394-7e20-4b94-a6e9-0d0cbfa15c1b",
      "name": "Analyze the site results and generate a report",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1280,
        528
      ],
      "parameters": {
        "text": "=Input : {{ $json.output.string }}",
        "options": {
          "systemMessage": "**ROLE**\nYou are an Elite Security & Bot Detection Analyst. You specialize in digital forensics, browser fingerprinting, and anti-bot evasion analysis.\n\n**INPUT DATA**\nYou will receive raw text output from a web scraping attempt. This data varies significantly and may include:\n- Detailed JSON/HTML fingerprint reports (e.g., from creepjs, ipqualityscore).\n- Raw HTTP headers or DNS records.\n- WAF Block pages (Cloudflare, Akamai, Datadome).\n- Simple \"Success\" or \"Access Denied\" messages.\n\n**OBJECTIVE**\nPerform a ruthless, line-by-line forensic analysis of the provided text to determine if the scraping attempt was **Identified (Bot)**, **Suspicious**, or **Clean (Human)**. You must correlate distinct data points to find inconsistencies.\n\n**ANALYSIS PROTOCOL (Analyze Closely)**\n1.  **Classify the Artifact:** Immediately identify if the input is a *Block Page*, a *Fingerprint Leak*, or a *Successful Load*.\n2.  **Network Forensics:**\n    * Analyze IP/ISP: Is it a residential ISP or a Data Center (AWS/GCP/DigitalOcean)?\n    * Geo-Correlation: Does the Timezone match the IP Location?\n3.  **Browser Integrity (The \"Red Flags\"):**\n    * **Automation Leaks:** Scan for traces of `webdriver`, `selenium`, `puppeteer`, `cdc_` variables, or `HeadlessChrome`.\n    * **OS/UA Mismatch:** Does the `User-Agent` (e.g., Windows NT 10) match the `navigator.platform` (e.g., Linux x86_64)?\n    * **Hardware Concurrency:** Are the CPU cores/Memory consistent with the claimed device type?\n4.  **Challenge Response:** If a CAPTCHA or Ray ID is present, analyze the specific rejection code (e.g., \"Error 1020\", \"403 Forbidden\").\n\n**OUTPUT SCHEMA**\nYou must return a **single, valid JSON object**.\n* The object must contain exactly one key: `\"text\"`.\n* The value of `\"text\"` must be a markdown-formatted string containing your forensic report.\n\n**JSON STRUCTURE:**\n{\n  \"text\": \"# \ud83d\udee1\ufe0f SECURITY DIAGNOSTIC REPORT\\n\\n[Your detailed markdown report here...]\"\n}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "cc199207-0036-4457-b073-9967ba41af81",
      "name": "Update Database",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1728,
        656
      ],
      "parameters": {
        "columns": {
          "value": {
            "Result": "={{ $json.output.text }}"
          },
          "schema": [
            {
              "id": "Result",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Result",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Result"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU/edit#gid=0",
          "cachedResultName": "DataBase"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU/edit?usp=drivesdk",
          "cachedResultName": "IP, Fingerprint Integrity and Bot Detection Check"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "b8e1a5ae-8b23-4f78-82fb-96afc89c972f",
      "name": "Add guarded test step",
      "type": "n8n-nodes-base.set",
      "notes": "Define your 10 target sites here.",
      "position": [
        1056,
        352
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "92d773de-ce86-4e15-8fb6-7a7fb3a2fbe9",
              "name": "Heavy_Guarded_Site",
              "type": "string",
              "value": "https://www.footlocker.co.uk/"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a1e67f53-d612-44e2-9b00-dc05c270dc5b",
      "name": "Check the site accessibility",
      "type": "n8n-nodes-browseract.browserAct",
      "position": [
        1264,
        352
      ],
      "parameters": {
        "type": "WORKFLOW",
        "workflowId": "76240546993093673",
        "workflowConfig": {
          "value": {
            "input-Ip_Bot_check_Link": "={{ $json.urls }}"
          },
          "schema": [
            {
              "id": "input-Ip_Bot_check_Link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "description": "If left blank, the default value defined in BrowserAct will be used.",
              "displayName": "Ip_Bot_check_Link",
              "defaultMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "input-Ip_Bot_check_Link"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "open_incognito_mode": false
      },
      "credentials": {
        "browserActApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "ba7c0a0a-67a8-4e75-acd3-d0a4b8c40f1a",
      "name": "Analyze the site results",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1568,
        224
      ],
      "parameters": {
        "text": "=Input : {{ $json.output.string }}",
        "options": {
          "systemMessage": "**ROLE**\nYou are a Senior Scraping Integrity & Security Analyst.\nYou will receive raw text output from an automated web scraper. This data is unpredictable: it could be the target website's content (success), a block page (Cloudflare/Datadome), a raw error log, or a browser fingerprinting report.\n\n**YOUR DUAL OBJECTIVE:**\n1.  **Verify Load Success:** Determine if the *intended* content actually loaded or if the request failed/was blocked.\n2.  **Security Forensics:** Analyze the text for signs of bot detection, IP leaks, or \"Access Denied\" triggers.\n\n**ANALYSIS PROTOCOL (Step-by-Step):**\n\n**STEP 1: LOAD VALIDATION (Did the site load?)**\n* **Success Indicators:** Look for \"meaningful content\" typical of a website (e.g., navigation menus, product prices, article text, footers, \"Copyright\").\n* **Failure Indicators:** Look for empty bodies, HTTP error codes (403, 404, 503), or generic placeholder text.\n* **Block Indicators:** Look for specific anti-bot keywords: \"Pardon our interruption\", \"Verify you are human\", \"One more step\", \"Access Denied\", \"Ray ID\", \"Cloudflare\", \"Datadome\".\n\n**STEP 2: FORENSIC DEEP DIVE**\n* If technical data is present (headers/fingerprint JSON):\n    * **Automation Leaks:** Scan for `WebDriver: true`, `Headless`, `Selenium`, `Puppeteer`.\n    * **Network:** Identify if the IP belongs to a datacenter (AWS/GCP) or looks like a residential user.\n    * **Consistency:** Does the User-Agent string match the platform (e.g., is it a Mac UA on a Linux server)?\n\n**OUTPUT FORMAT**\nYou must return a **single valid JSON object**.\nThe object must contain exactly one key named `\"text\"`.\nThe value of `\"text\"` must be a markdown-formatted report string.\n\n**JSON STRUCTURE:**\n\n{\n  \"text\": \"...\"\n}"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "23b74342-b73a-49d5-8cb6-daae36531e95",
      "name": "Update Database1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2208,
        384
      ],
      "parameters": {
        "columns": {
          "value": {
            "Result": "={{ $json.output.text }}"
          },
          "schema": [
            {
              "id": "Result",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Result",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Result"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU/edit#gid=0",
          "cachedResultName": "DataBase"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU/edit?usp=drivesdk",
          "cachedResultName": "IP, Fingerprint Integrity and Bot Detection Check"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "06f0c1b2-d52f-43dc-b7ff-dad349f3901e",
      "name": "Fetch stored data",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2432,
        384
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU/edit#gid=0",
          "cachedResultName": "DataBase"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1HFoUBjTGTvbS2Na_QCdde0Htg_b_tIDFUa0g7EhS4uU/edit?usp=drivesdk",
          "cachedResultName": "IP, Fingerprint Integrity and Bot Detection Check"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "1d1de15a-8619-45f8-8adb-ca4398e3c6c8",
      "name": "Process final data",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2848,
        384
      ],
      "parameters": {
        "text": "=Input : {{ JSON.stringify($json.data, null, 2) }}",
        "options": {
          "systemMessage": "You are the Lead Automation Security Auditor.\nYou will receive a list of individual diagnostic reports from multiple test sites (e.g., SannySoft, Cloudflare, Recaptcha).\n\n**YOUR GOAL:**\nAnalyze the aggregate data to find patterns of failure and issue a final \"Go/No-Go\" decision for the scraping infrastructure.\n\n**ANALYSIS LOGIC:**\n1. **Calculate Success Rate:** How many sites returned \"Status: PASS\"?\n2. **Identify Weak Links:** If one site failed (e.g., Cloudflare), but others passed, identify exactly why (e.g., \"Failed at CAPTCHA\" vs \"Failed at IP Reputation\").\n3. **Check Consistency:** Did the \"IP Address\" or \"Fingerprint\" stay the same across all reports? (It should be consistent).\n\n**OUTPUT FORMAT:**\nYou must return a **single valid JSON object**.\nThe object must contain exactly one key named `\"text\"`.\nThe value of `\"text\"` must be a formatted summary string (using \\n for newlines).\n\n**Master Report Structure (inside the \"text\" value):**\n1. \ud83c\udfc1 FINAL MISSION VERDICT (GO / NO-GO)\n2. \ud83d\udcca SCORECARD (e.g., \"4/5 Sites Passed\")\n3. \ud83d\udea8 CRITICAL FAILURES (Summarize specific blocks: \"Cloudflare detected automation\", \"IP Blacklisted on SannySoft\")\n4. \ud83d\udd17 CONSISTENCY CHECK (Did IP/Fingerprint vary suspiciously between sites?)\n5. \ud83d\udee0\ufe0f RECOMMENDATION (Actionable advice: \"Rotate Proxy\", \"Update User-Agent\", or \"Ready to Deploy\")\n\n**Constraint:** Do not output markdown code blocks. Output only the raw JSON string."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "05a08287-9701-4d12-afe4-5344a8b3d14d",
      "name": "Send Report",
      "type": "n8n-nodes-base.slack",
      "position": [
        3232,
        384
      ],
      "parameters": {
        "text": "={{ $json.output.text }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C09KLV9DJSX",
          "cachedResultName": "all-browseract-workflow-test"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "be5b083d-919d-4e8b-8b9a-777aa52d4a5f",
      "name": "Documentation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -608,
        -48
      ],
      "parameters": {
        "width": 380,
        "height": 520,
        "content": "## \u26a1 Workflow Overview & Setup\n\n**Summary:** This automation continuously monitors the integrity of your IP address and browser fingerprint. It visits multiple detection sites using BrowserAct, analyzes the results with AI to find leaks (like WebRTC or DNS), and generates a consolidated security report in Slack.\n\n### Requirements\n* **Credentials:** BrowserAct, OpenRouter, Google Sheets, Slack.\n* **Mandatory:** BrowserAct API (Template: **IP, Fingerprint Integrity and Bot Detection Check**)\n\n### How to Use\n1.  **Credentials:** Set up API keys for all services.\n2.  **BrowserAct Template:** Ensure the **IP, Fingerprint Integrity and Bot Detection Check** template is active.\n3.  **Google Sheet:** Create a sheet to store the raw diagnostic logs.\n4.  **Configuration:** Update the **Define Target URLs** node with the list of detection sites you want to test (e.g., Pixelscan, IPQualityScore).\n\n### Need Help?\n[How to Find Your BrowserAct API Key & Workflow ID](https://docs.browseract.com)\n[How to Connect n8n to BrowserAct](https://docs.browseract.com)\n[How to Use & Customize BrowserAct Templates](https://docs.browseract.com)"
      },
      "typeVersion": 1
    },
    {
      "id": "2d7959d8-f4ee-48c6-97a5-9b5992473462",
      "name": "Step 1 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        368
      ],
      "parameters": {
        "color": 7,
        "width": 812,
        "height": 108,
        "content": "### \ud83d\udd75\ufe0f Step 1: Multi-Site Testing\n\nThe workflow iterates through a list of target URLs. It uses BrowserAct to visit each site, attempting to bypass anti-bot measures and capture the raw diagnostic output (IP score, fingerprint hash, etc.)."
      },
      "typeVersion": 1
    },
    {
      "id": "c29c61ca-306c-44ba-a188-a3de23af13ec",
      "name": "Step 2 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        768,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 1116,
        "height": 108,
        "content": "### \ud83d\udee1\ufe0f Step 2: Forensic Analysis\n\nFor each site visited, an AI \"Security Analyst\" parses the raw text. It looks for red flags like mismatched User-Agents, leaked real IPs, or known bot signatures (e.g., \"Selenium detected\")."
      },
      "typeVersion": 1
    },
    {
      "id": "493cb450-641e-4e9e-8224-66ab75c80e16",
      "name": "Step 3 Explanation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2192,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 1196,
        "height": 112,
        "content": "### \ud83d\udcca Step 3: Aggregation & Reporting\n\nAll individual site reports are stored in a Google Sheet. Once the full list is processed, a final AI agent reviews the aggregate data to determine an overall \"Pass/Fail\" score and sends a summary report to Slack."
      },
      "typeVersion": 1
    },
    {
      "id": "bf2ccb22-ae96-43a7-8cac-87519e784048",
      "name": "OpenRouter",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1536,
        416
      ],
      "parameters": {
        "model": "openai/gpt-4o",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "96078420-19ef-4cc4-a9fd-6c5ee5b3f35e",
      "name": "Extract the agent checking sites",
      "type": "n8n-nodes-browseract.browserAct",
      "position": [
        1056,
        528
      ],
      "parameters": {
        "type": "WORKFLOW",
        "workflowId": "76240546993093673",
        "workflowConfig": {
          "value": {
            "input-Ip_Bot_check_Link": "={{ $json.urls }}"
          },
          "schema": [
            {
              "id": "input-Ip_Bot_check_Link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "description": "If left blank, the default value defined in BrowserAct will be used.",
              "displayName": "Ip_Bot_check_Link",
              "defaultMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "input-Ip_Bot_check_Link"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "open_incognito_mode": false
      },
      "credentials": {
        "browserActApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "94f85f86-0248-4d9f-a392-5f148b6a0d61",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        -64
      ],
      "parameters": {
        "color": 6,
        "width": 656,
        "height": 384,
        "content": "@[youtube](64cKXeY52NQ)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "61dcf342-ae32-47a6-a825-ba5b60623f27",
  "connections": {
    "Aggregate": {
      "main": [
        [
          {
            "node": "Process final data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Loop Over URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter": {
      "ai_languageModel": [
        [
          {
            "node": "Analyze the site results",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Structured Output Parser2",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Clear Database": {
      "main": [
        [
          {
            "node": "Define Target URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over URLs": {
      "main": [
        [
          {
            "node": "Add guarded test step",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Extract the agent checking sites",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Database": {
      "main": [
        [
          {
            "node": "Loop Over URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute manually": {
      "main": [
        [
          {
            "node": "Clear Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Database1": {
      "main": [
        [
          {
            "node": "Fetch stored data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch stored data": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Define Target URLs": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process final data": {
      "main": [
        [
          {
            "node": "Send Report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add guarded test step": {
      "main": [
        [
          {
            "node": "Check the site accessibility",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Analyze the site results and generate a report",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Structured Output Parser",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Process final data",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "Structured Output Parser1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Analyze the site results": {
      "main": [
        [
          {
            "node": "Update Database1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Analyze the site results and generate a report",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser1": {
      "ai_outputParser": [
        [
          {
            "node": "Process final data",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser2": {
      "ai_outputParser": [
        [
          {
            "node": "Analyze the site results",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Check the site accessibility": {
      "main": [
        [
          {
            "node": "Analyze the site results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract the agent checking sites": {
      "main": [
        [
          {
            "node": "Analyze the site results and generate a report",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze the site results and generate a report": {
      "main": [
        [
          {
            "node": "Update Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}