{
  "name": "Real-time public transport delay tracking with ScrapeGraphAI, Teams & Dropbox",
  "nodes": [
    {
      "id": "f025c83b-a573-4b56-a0e8-3fbee6d1c304",
      "name": "Webhook Listener",
      "type": "n8n-nodes-base.webhook",
      "position": [
        720,
        128
      ]
    },
    {
      "id": "a46fe08f-20a4-42c1-aaf0-40714b7a8395",
      "name": "Prepare Source URLs",
      "type": "n8n-nodes-base.code",
      "position": [
        928,
        128
      ]
    },
    {
      "id": "f1f8d3d0-5466-4dba-92df-e455f9ac7400",
      "name": "Split URLs",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1184,
        144
      ]
    },
    {
      "id": "40056754-c138-41b6-a8dd-1a0fae49f90f",
      "name": "Scrape Transit Data",
      "type": "n8n-nodes-scrapegraphai.scrapegraphAi",
      "position": [
        1344,
        128
      ]
    },
    {
      "id": "b87edbfa-b83a-45ef-8734-c169bfaab8ea",
      "name": "Merge Results",
      "type": "n8n-nodes-base.merge",
      "position": [
        1520,
        128
      ]
    },
    {
      "id": "b03df1ef-2b05-4658-8923-f0849a572c80",
      "name": "Normalize & Deduplicate",
      "type": "n8n-nodes-base.code",
      "position": [
        1728,
        112
      ]
    },
    {
      "id": "c8b52bd7-0213-4ae4-89f0-ba49170b2cc5",
      "name": "Significant Delay?",
      "type": "n8n-nodes-base.if",
      "position": [
        1920,
        96
      ]
    },
    {
      "id": "8f007787-0902-4015-819a-bb6bd7947204",
      "name": "Send Teams Alert",
      "type": "n8n-nodes-base.microsoftTeams",
      "position": [
        2064,
        80
      ]
    },
    {
      "id": "2e2c46a2-503d-4f6d-9d9f-35ce8597a9d9",
      "name": "Prepare File for Dropbox",
      "type": "n8n-nodes-base.set",
      "position": [
        1760,
        640
      ]
    },
    {
      "id": "c542a632-fbbe-4300-9122-44ac71da9d6b",
      "name": "Archive to Dropbox",
      "type": "n8n-nodes-base.dropbox",
      "position": [
        1952,
        640
      ]
    },
    {
      "id": "a5dcb0f0-5661-45c4-9902-155e4c14cdc8",
      "name": "Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        64,
        -224
      ],
      "parameters": {
        "width": 550,
        "height": 834,
        "content": "## How it works\n\nThis webhook-driven workflow listens for a POST request that contains the routes a traveler cares about. As soon as the call hits the Webhook Trigger, a Code node builds a list of off"
      }
    },
    {
      "id": "9643fb7a-0f0f-455e-ba56-b3f119c2c54c",
      "name": "Section – Trigger & URLs",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        672,
        -240
      ],
      "parameters": {
        "width": 450,
        "height": 782,
        "content": "## Trigger & URL Builder\n\nThis group kick-starts the automation each time your mobile app or another service calls the webhook. The **Webhook Listener** instantly accepts the POST request and returns "
      }
    },
    {
      "id": "0c365170-7c26-4ac0-a7cc-42abb2ea1cae",
      "name": "Section – Scraping Layer",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1168,
        -240
      ],
      "parameters": {
        "width": 450,
        "height": 782,
        "content": "## Scraping Layer\n\nThe scraping layer is where the heavy lifting occurs. **Scrape Transit Data** leverages ScrapeGraphAI’s LLM-powered parser to read the live timetable or alert page and transform it "
      }
    },
    {
      "id": "d0794c25-d4d7-4043-bcae-0bdb9891ab20",
      "name": "Section – Processing & Alerts",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        -288
      ],
      "parameters": {
        "width": 450,
        "height": 542,
        "content": "## Processing & Alerting\n\nOnce all raw pages are scraped, **Normalize & Deduplicate** tidies the data. It standardises field names, stamps each record with the current timestamp and removes any duplic"
      }
    },
    {
      "id": "645f9075-f12e-43bd-8063-4cf59df9936d",
      "name": "Section – Storage & Archiving",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1728,
        256
      ],
      "parameters": {
        "width": 450,
        "height": 622,
        "content": "## Storage & Archiving\n\nEvery execution—alert-worthy or not—gets recorded for historical analysis. **Prepare File for Dropbox** assembles a concise JSON representation of each item and crafts a timest"
      }
    }
  ],
  "connections": {
    "Split URLs": {
      "main": [
        [
          {
            "node": "Scrape Transit Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Results": {
      "main": [
        [
          {
            "node": "Normalize & Deduplicate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Teams Alert": {
      "main": [
        [
          {
            "node": "Prepare File for Dropbox",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook Listener": {
      "main": [
        [
          {
            "node": "Prepare Source URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Significant Delay?": {
      "main": [
        [
          {
            "node": "Send Teams Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Prepare File for Dropbox",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Source URLs": {
      "main": [
        [
          {
            "node": "Split URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape Transit Data": {
      "main": [
        [
          {
            "node": "Merge Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize & Deduplicate": {
      "main": [
        [
          {
            "node": "Significant Delay?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare File for Dropbox": {
      "main": [
        [
          {
            "node": "Archive to Dropbox",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}