{
  "name": "Track certification requirements with ScrapeGraphAI, GitLab and Rocket.Chat",
  "nodes": [
    {
      "id": "60a587ac-1ae6-42d3-ba21-ae3bbdadc9ec",
      "name": "Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        368
      ],
      "parameters": {
        "width": 550,
        "height": 738,
        "content": "## How it works\n\nThis workflow lets certification-holding professionals subscribe to live updates from the bodies that publish renewal rules. A webhook call—ideal for a button in your portal or a sche"
      }
    },
    {
      "id": "04b7e6a7-f8c9-49fe-a75c-2848ea758ac2",
      "name": "Section – Trigger & Config",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        352
      ],
      "parameters": {
        "width": 450,
        "height": 670,
        "content": "## Trigger & URL Configuration\n\nThe three nodes beneath this note collectively kick-off the entire automation. The **Incoming Webhook** waits for any POST call—this keeps the workflow decoupled from s"
      }
    },
    {
      "id": "69c51aa4-d3d6-4235-ba9d-a38c07ae338b",
      "name": "Section – Scraping",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        960,
        352
      ],
      "parameters": {
        "width": 498,
        "height": 654,
        "content": "## AI-Powered Scraping\n\nScrapeGraphAI sits at the heart of this section. For every incoming URL it receives from the previous step, the node uses its LLM-backed engine to locate and extract a **certif"
      }
    },
    {
      "id": "43bff25b-c2d2-467f-98c9-80d17f3e867d",
      "name": "Section – Aggregation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1456,
        352
      ],
      "parameters": {
        "width": 450,
        "height": 654,
        "content": "## Aggregation & Baseline Retrieval\n\nOnce each requirement item is clean, the **Aggregate Results** Code node gathers all individual items into a single JSON array named `currentRequirements`. This en"
      }
    },
    {
      "id": "feb1182d-f752-45f1-b648-339fdfd9fd57",
      "name": "Section – Decision & Alerting",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1968,
        336
      ],
      "parameters": {
        "width": 450,
        "height": 670,
        "content": "## Change Detection & Routing\n\nThe **Detect Changes** Code node receives both the freshly scraped array and the baseline file contents. It performs a deep comparison by stringifying each object and ch"
      }
    },
    {
      "id": "c7ef8b21-f99b-4b9a-b6bc-0b4f1e88816b",
      "name": "Section – Storage & Notification",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2448,
        352
      ],
      "parameters": {
        "width": 450,
        "height": 670,
        "content": "## Storage & Notifications\n\nWhen the IF node flags a change, two things happen in parallel. First, a **Rocket.Chat** node publishes a concise message—along with a JSON code-block diff—directly to the "
      }
    },
    {
      "id": "0513e5d7-9756-48ad-a62f-1ca96f29285f",
      "name": "Incoming Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        512,
        704
      ]
    },
    {
      "id": "7a60284c-f53e-428f-a783-197989db5929",
      "name": "Prepare Certification URLs",
      "type": "n8n-nodes-base.code",
      "position": [
        720,
        704
      ]
    },
    {
      "id": "1c1701a3-156b-432a-b62e-4c3dcf4eff88",
      "name": "Scrape Certification Requirements",
      "type": "n8n-nodes-scrapegraphai.scrapegraphAi",
      "position": [
        1008,
        704
      ]
    },
    {
      "id": "7e4f845c-2609-4021-8455-c6326bc38716",
      "name": "Normalize Requirement Data",
      "type": "n8n-nodes-base.code",
      "position": [
        1168,
        704
      ]
    },
    {
      "id": "3fb1f1bf-2778-4f4e-a9e3-38205f0ae48b",
      "name": "Aggregate Results",
      "type": "n8n-nodes-base.code",
      "position": [
        1312,
        704
      ]
    },
    {
      "id": "71659c6d-1f11-49d9-8bd6-f53d99737970",
      "name": "Get Baseline From GitLab",
      "type": "n8n-nodes-base.gitlab",
      "position": [
        1520,
        656
      ]
    },
    {
      "id": "de304529-ebb4-4c1d-a7da-226e2a830384",
      "name": "Merge Current & Baseline",
      "type": "n8n-nodes-base.merge",
      "position": [
        1520,
        864
      ]
    },
    {
      "id": "4dc02ba4-560e-4005-ac25-0bf7b17729b4",
      "name": "Detect Changes",
      "type": "n8n-nodes-base.code",
      "position": [
        1728,
        800
      ]
    },
    {
      "id": "63ea089a-f653-4d20-80f5-840a1a093344",
      "name": "Requirements Changed?",
      "type": "n8n-nodes-base.if",
      "position": [
        2016,
        816
      ]
    },
    {
      "id": "ad46c00e-8c17-44b2-ab37-b2332a0c1b43",
      "name": "Send Rocket.Chat Alert",
      "type": "n8n-nodes-base.rocketchat",
      "position": [
        2464,
        672
      ]
    },
    {
      "id": "fb77fc49-d0e7-4339-bb8e-65f41f1ad432",
      "name": "Update GitLab Record",
      "type": "n8n-nodes-base.gitlab",
      "position": [
        2224,
        880
      ]
    },
    {
      "id": "f02b6222-b38f-4db5-b7f6-56c81ae45270",
      "name": "Respond to Webhook",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        2640,
        816
      ]
    }
  ],
  "connections": {
    "Detect Changes": {
      "main": [
        [
          {
            "node": "Requirements Changed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Incoming Webhook": {
      "main": [
        [
          {
            "node": "Prepare Certification URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Results": {
      "main": [
        [
          {
            "node": "Get Baseline From GitLab",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Current & Baseline",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Update GitLab Record": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Requirements Changed?": {
      "main": [
        [
          {
            "node": "Send Rocket.Chat Alert",
            "type": "main",
            "index": 0
          },
          {
            "node": "Update GitLab Record",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Rocket.Chat Alert": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Baseline From GitLab": {
      "main": [
        [
          {
            "node": "Merge Current & Baseline",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Current & Baseline": {
      "main": [
        [
          {
            "node": "Detect Changes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Requirement Data": {
      "main": [
        [
          {
            "node": "Aggregate Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Certification URLs": {
      "main": [
        [
          {
            "node": "Scrape Certification Requirements",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Certification Requirements": {
      "main": [
        [
          {
            "node": "Normalize Requirement Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}