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 →
{
"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.
httpCustomAuthhttpHeaderAuth
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
[n8n] Advanced URL Parsing and Shortening Workflow - Switchy.io Integration. Uses splitInBatches, stickyNote, httpRequest, html. Event-driven trigger; 56 nodes.
[](https://youtu.be/c7yCZhmMjtI)
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
Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest. Event-driven trigger; 51 nodes.