AutomationFlowsWeb Scraping › Uitinvlaanderen Calender

Uitinvlaanderen Calender

UitInVlaanderen Calender. Uses httpRequest. Event-driven trigger; 13 nodes.

Event trigger★★★★☆ complexity13 nodesHTTP Request
Web Scraping Trigger: Event Nodes: 13 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "UitInVlaanderen Calender",
  "nodes": [
    {
      "parameters": {},
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -352,
        128
      ],
      "id": "fb08e6b5-7393-4773-a25a-a2d1415330c2",
      "name": "When clicking \u2018Execute workflow\u2019"
    },
    {
      "parameters": {
        "url": "=https://io.uitdatabank.be/events/?disableDefaultFilters=true&embed=true&sort[created]=desc",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "={{ $json.query }}"
            },
            {
              "name": "limit",
              "value": "1000"
            },
            {
              "name": "start",
              "value": "0"
            },
            {
              "name": "workflowStatus",
              "value": "READY_FOR_VALIDATION,APPROVED"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        368,
        64
      ],
      "id": "9516c4dc-128b-44ac-a12b-a098f68c0d9d",
      "name": "HTTP Request",
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        },
        "httpCustomAuth": {
          "name": "<your credential>"
        }
      },
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "mode": "raw",
        "jsonOutput": "={{ $json.data }}",
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        624,
        96
      ],
      "id": "d154781b-5147-4d9f-bc04-69e94eafaa80",
      "name": "Edit Fields"
    },
    {
      "parameters": {
        "path": "uitinvlaanderen",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -448,
        -128
      ],
      "id": "825daf4b-b806-4c0d-b8d9-52aa462be750",
      "name": "Webhook"
    },
    {
      "parameters": {
        "fieldToSplitOut": "=member",
        "options": {}
      },
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        864,
        128
      ],
      "id": "0b156669-88da-4171-a171-0438f4fa32e6",
      "name": "Split Out"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "f9e8435c-73d4-4a66-9463-43f442e98cb4",
              "name": "query",
              "value": "={{ $json.query.q }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -224,
        -96
      ],
      "id": "dca6305c-194a-498d-9194-4787706d3e5f",
      "name": "Get query"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "54b6142d-de70-4ec8-b20c-9c8925623034",
              "name": "query",
              "value": "regions:nis-24107 AND languages:nl",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -128,
        112
      ],
      "id": "7bf3fa1e-334b-44f0-9f04-83b9d7bca5b0",
      "name": "Example query"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "869b0c7b-606f-4912-88b7-222178eafca1",
              "name": "query",
              "value": "=({{$json.query}}) AND dateRange:[{{new Date().toDateTime().minus(7, 'day').startOf(\"day\").format(\"yyyy-MM-dd'T'HH:mm:ssZZ\") }} TO *]",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        176,
        32
      ],
      "id": "478bb4f2-9a20-4ff0-9b98-58b18d8e5211",
      "name": "Add today -> future query limitation"
    },
    {
      "parameters": {
        "respondWith": "text",
        "responseBody": "={{ $json.value }}",
        "options": {
          "responseHeaders": {
            "entries": [
              {
                "name": "Content-Type",
                "value": "text/calendar; charset=utf-8"
              }
            ]
          }
        }
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1344,
        32
      ],
      "id": "fc9c331c-5e33-4e6b-9d01-7133f4767ff8",
      "name": "Respond to Webhook"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 3
          },
          "conditions": [
            {
              "id": "22760eaf-f2fb-45ce-a894-3fc613c3bafc",
              "leftValue": "={{ $json.query }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        -16,
        -80
      ],
      "id": "2864bb8c-e529-4e68-952f-b1daa61b1754",
      "name": "If"
    },
    {
      "parameters": {
        "respondWith": "text",
        "responseBody": "={\n  \"error\": \"Query parameter (q) not specified\"\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        416,
        -176
      ],
      "id": "54c81136-1690-45b8-aa74-bfcdf9bb8e52",
      "name": "Respond to Webhook1"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        560,
        288
      ],
      "id": "e1ef4821-881d-47c1-93bf-5413da3c1eb0",
      "name": "Respond to Webhook2"
    },
    {
      "parameters": {
        "jsCode": "const ics = require('ics')\n\nfunction getDate(start, end, giveEnd) {\n   const retDate = giveEnd ? end : start;\n  \n   if(end.getTime() - start.getTime() > 24 * 3600 * 1000)\n     return  [\n              retDate.getUTCFullYear(),\n              retDate.getUTCMonth() + 1,\n              retDate.getUTCDate()\n            ];  \n  \n   return  [\n              retDate.getUTCFullYear(),\n              retDate.getUTCMonth() + 1,\n              retDate.getUTCDate(),\n              retDate.getUTCHours(),\n              retDate.getUTCMinutes()\n            ];\n}\n\n\n\nconst calEvents = [];\nfor (const item of $input.all()) {\n  if(item.json.startDate && item.json.endDate) {\n\n    const description = item.json.description?.nl.replace(/<[^>]*>?/gm, '').substring(0,100);\n\n    const title = `${item.json.name?.nl} (${item.json.organizer?.name?.nl})`;\n    const id = item.json[\"@id\"].split('/').pop();\n    const url = `https://www.uitinvlaanderen.be/agenda/e//${id}`;\n    \n    if(item.json.calendarType == \"multiple\") {\n      for(let ev of item.json.subEvent) {\n          const start = new Date(ev.startDate);\n          const end = new Date(ev.endDate);\n\n          if(start.getTime() < new Date(new Date().toLocaleDateString()).getTime() - 7 * 24 * 3600 * 1000)\n             continue;\n        \n          calEvents.push({\n           uid: id + \"_\" + ev.id,\n           title: title,\n          //htmlContent: `<html><body>${item.json.description?.nl}</body></html>`,\n           url: url,\n           description: description,\n           location: item.json.location.name.nl,\n           geo: item.json.location && item.json.location.geo ? {\n             lat: item.json.location.geo.latitude,\n             lon: item.json.location.geo.longitude,\n           } : undefined,\n         /*  organizer: item.json.organizer ? {\n             name: item.json.organizer?.name?.nl, \n             email: item.json.organizer?.contactPoint?.email[0]\n           } : undefined,*/\n           startInputType: \"utc\",\n           startOutputType: \"utc\",\n           start: getDate(start,end, false),\n          \n           endInputType: \"utc\",\n           endOutputType: \"utc\",\n           end: getDate(start,end, true)\n        });\n      }\n    }\n    else {\n      const start = new Date(item.json.startDate);\n      const end = new Date(item.json.endDate);\n      calEvents.push({\n       uid: item.json[\"@id\"].split('/').pop(),\n       title: title,\n      // htmlContent: `<html><body>${item.json.description?.nl}</body></html>`,\n       url: url,\n       description: description,\n       location: item.json.location.name.nl,\n       geo: item.json.location && item.json.location.geo ? {\n         lat: item.json.location.geo.latitude,\n         lon: item.json.location.geo.longitude,\n       } : undefined,\n      /* organizer: item.json.organizer ? {\n         name: item.json.organizer?.name?.nl, \n         email: item.json.organizer?.contactPoint?.email[0]\n        } : undefined,*/\n       startInputType: \"utc\",\n       startOutputType: \"utc\",\n       start: getDate(start,end, false),\n      \n       endInputType: \"utc\",\n       endOutputType: \"utc\",\n       end: getDate(start,end, true)\n    });\n    }\n  }\n}\nconsole.log(calEvents);\nconst { error, value } = ics.createEvents(calEvents);\n\nreturn { error, value };"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1136,
        112
      ],
      "id": "1a90667f-9a04-4942-9ee9-058651f0c108",
      "name": "Convert to ics"
    }
  ],
  "connections": {
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Example query",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond to Webhook2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Get query",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get query": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Example query": {
      "main": [
        [
          {
            "node": "Add today -> future query limitation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add today -> future query limitation": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Convert to ics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Add today -> future query limitation",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond to Webhook1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert to ics": {
      "main": [
        [
          {
            "node": "Respond to Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": true,
  "settings": {
    "executionOrder": "v1",
    "availableInMCP": false,
    "timeSavedMode": "fixed",
    "saveDataSuccessExecution": "all",
    "callerPolicy": "workflowsFromSameOwner",
    "executionTimeout": -1
  },
  "versionId": "dcc830ea-0308-41e2-a04b-5df700a51789",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "6ZpHfo0iCDY_vXq0vY25W",
  "tags": []
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

UitInVlaanderen Calender. Uses httpRequest. Event-driven trigger; 13 nodes.

Source: https://gist.github.com/drake7707/51c4fad764af2fe9084a773722d540d1 — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

This workflow allows you to import any workflow from a file or another n8n instance and map the credentials easily. A multi-form setup guides you through the entire process At the beginning you have t

Execute Command, Read Write File, HTTP Request +3
Web Scraping

[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.

HTTP Request, GitHub, Stop And Error +1
Web Scraping

[](https://youtu.be/c7yCZhmMjtI)

HTTP Request, GitHub, Stop And Error +1
Web Scraping

This automation organizes your n8n workflows files into categorizes (Active, Template, Done, Archived) and uploads them directly to a categorized Google Drive folders. It is designed to help users man

Google Drive, HTTP Request, Time Saved
Web Scraping

Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.

HTTP Request