{"openapi":"3.0.3","info":{"title":"GriezelGids API & AI Tools","description":"Public API and LLM/Agent tools for GriezelGids (https://griezelgids.nl) — the #1 interactive Halloween guide, trick-or-treat route map, and neighborhood community platform for the Netherlands, Belgium, and international communities.","version":"1.3.58","contact":{"name":"GriezelGids Team","url":"https://griezelgids.nl"}},"servers":[{"url":"/","description":"Current Server (Relative)"},{"url":"https://api.griezelgids.nl","description":"Production API Server"},{"url":"https://api-next.griezelgids.nl","description":"Staging API Server"},{"url":"https://admin-api.griezelgids.nl","description":"Production Admin/Ops Server"},{"url":"https://admin-api-next.griezelgids.nl","description":"Staging Admin/Ops Server"},{"url":"https://griezelgids.nl","description":"Production Main Domain"},{"url":"http://localhost:3000","description":"Local Development Server"}],"paths":{"/api/llm/search":{"get":{"operationId":"searchTrickOrTreat","summary":"Search trick-or-treat candy spots, neighborhoods, and postal-code areas near a city or coordinates","description":"Answers questions like 'Where can I trick or treat in Oosterhout?' or postal code lookups. Returns participating house counts, neighborhoods, zipcodes, related haunted attractions (labeled separately), Halloween events, privacy notice, and direct map/print/flyer links. Exact house numbers are withheld.","parameters":[{"name":"query","in":"query","description":"City name, postal code (e.g. 'Oosterhout', 'Breda Centrum', '4901'), or neighborhood","required":false,"schema":{"type":"string","example":"Oosterhout"}},{"name":"lat","in":"query","description":"Latitude coordinate (optional if query is provided)","required":false,"schema":{"type":"number","example":51.643}},{"name":"lng","in":"query","description":"Longitude coordinate (optional if query is provided)","required":false,"schema":{"type":"number","example":4.862}},{"name":"radiusKm","in":"query","description":"Search radius in kilometers (default 5km, max 50km)","required":false,"schema":{"type":"number","default":5}},{"name":"format","in":"query","description":"Response format: 'json' or 'markdown'","required":false,"schema":{"type":"string","enum":["json","markdown"],"default":"json"}}],"responses":{"200":{"description":"Search results with participating houses, zones, and interactive deep-links","content":{"application/json":{"schema":{"type":"object","properties":{"found":{"type":"boolean"},"location":{"type":"object","properties":{"displayName":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"city":{"type":"string"},"postcode":{"type":"string"},"radiusKm":{"type":"number"}}},"stats":{"type":"object","properties":{"totalHouses":{"type":"integer"},"totalZones":{"type":"integer"}}},"deepLinks":{"type":"object","properties":{"liveMap":{"type":"string"},"printMap":{"type":"string"},"flyerMaker":{"type":"string"},"addHouse":{"type":"string"}}},"markdownSummary":{"type":"string"},"attribution":{"type":"string"}}}}}}}}},"/api/llm/haunted":{"get":{"operationId":"findHauntedHouses","summary":"Find haunted houses, spooky walking zones, and horror experiences","description":"Answers questions like 'Are there any haunted houses near Oosterhout?'. Do not use this for ordinary candy trick-or-treating.","parameters":[{"name":"query","in":"query","description":"City name or postal code","required":false,"schema":{"type":"string","example":"Oosterhout"}},{"name":"lat","in":"query","description":"Latitude coordinate","required":false,"schema":{"type":"number"}},{"name":"lng","in":"query","description":"Longitude coordinate","required":false,"schema":{"type":"number"}},{"name":"radiusKm","in":"query","description":"Search radius in km (default 15km)","required":false,"schema":{"type":"number","default":15}},{"name":"format","in":"query","schema":{"type":"string","enum":["json","markdown"],"default":"json"}}],"responses":{"200":{"description":"List of haunted zones and attractions with descriptions and map links","content":{"application/json":{"schema":{"type":"object","properties":{"found":{"type":"boolean"},"totalHauntedZones":{"type":"integer"},"hauntedZones":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"photoUrl":{"type":"string"},"deepLink":{"type":"string"}}}},"markdownSummary":{"type":"string"}}}}}}}}},"/api/llm/flyer":{"get":{"operationId":"generateFlyer","summary":"Generate a custom neighborhood Halloween window flyer","description":"Generates a customized ready-to-print A4 Halloween poster with QR codes and neighborhood details. Returns both an interactive studio edit link and downloadable vector SVG.","parameters":[{"name":"neighbourhood","in":"query","description":"Neighborhood or village name (e.g. 'Vogelbuurt')","required":false,"schema":{"type":"string","example":"Vogelbuurt"}},{"name":"eventName","in":"query","description":"Event title (default: 'Snoep of je Leven!')","required":false,"schema":{"type":"string","default":"Snoep of je Leven!"}},{"name":"eventDate","in":"query","description":"Date string (e.g. 'Zaterdag 31 Oktober')","required":false,"schema":{"type":"string","default":"Zaterdag 31 Oktober"}},{"name":"startTime","in":"query","description":"Start time (e.g. '18:30')","required":false,"schema":{"type":"string","default":"18:30"}},{"name":"organizer","in":"query","description":"Organizer or neighborhood committee name","required":false,"schema":{"type":"string"}},{"name":"contact","in":"query","description":"Contact email or info","required":false,"schema":{"type":"string"}},{"name":"format","in":"query","description":"Output format: 'json' or 'svg'","required":false,"schema":{"type":"string","enum":["json","svg"],"default":"json"}}],"responses":{"200":{"description":"Flyer URLs, pre-filled studio deep-link, and SVG asset","content":{"application/json":{"schema":{"type":"object","properties":{"studioUrl":{"type":"string"},"autoPrintUrl":{"type":"string"},"svgDownloadUrl":{"type":"string"},"instructions":{"type":"string"}}}},"image/svg+xml":{"schema":{"type":"string","format":"binary"}}}}}}},"/api/llm/map":{"get":{"operationId":"getNeighborhoodMap","summary":"Get live map and printable A4 route studio deep-links","description":"Returns map links for navigation or offline printing of neighborhood walking maps with street listings.","parameters":[{"name":"query","in":"query","description":"City name or postal code","required":false,"schema":{"type":"string","example":"Oosterhout"}},{"name":"lat","in":"query","schema":{"type":"number"}},{"name":"lng","in":"query","schema":{"type":"number"}},{"name":"zoom","in":"query","schema":{"type":"number","default":16}}],"responses":{"200":{"description":"Map coordinates and deep-links","content":{"application/json":{"schema":{"type":"object","properties":{"found":{"type":"boolean"},"location":{"type":"object","properties":{"displayName":{"type":"string"},"lat":{"type":"number"},"lng":{"type":"number"},"zoom":{"type":"number"}}},"deepLinks":{"type":"object","properties":{"interactiveMap":{"type":"string"},"printStudio":{"type":"string"}}}}}}}}}}},"/api/map":{"get":{"operationId":"getRawMapData","summary":"Get raw map data within a bounding radius","description":"Public map endpoint returning houses, zones, and local newspaper articles within radiusKm.","parameters":[{"name":"lat","in":"query","schema":{"type":"number"}},{"name":"lng","in":"query","schema":{"type":"number"}},{"name":"radius","in":"query","schema":{"type":"number","default":5}}],"responses":{"200":{"description":"Raw houses, zones, and articles","content":{"application/json":{"schema":{"type":"object","properties":{"houses":{"type":"array","items":{"type":"object"}},"zones":{"type":"array","items":{"type":"object"}},"newspaper":{"type":"array","items":{"type":"object"}}}}}}}}}},"/api/donate":{"get":{"operationId":"getDonateProgress","summary":"Public donate goals and optional live total","description":"Returns prioritized operating and bonus goals with waterfall funding. When a dedicated bunq donate account is configured on the ops server, includes a cached totalReceivedCents. Never includes personal transactions, names, or IBANs. Unconfigured bunq returns live: false with the same goals.","responses":{"200":{"description":"Donate goals and progress","content":{"application/json":{"schema":{"type":"object","properties":{"live":{"type":"boolean"},"totalReceivedCents":{"type":"integer","nullable":true},"updatedAt":{"type":"string","nullable":true,"format":"date-time"},"donateUrl":{"type":"string","example":"https://bunq.me/SaschaWorms"},"currency":{"type":"string","example":"EUR"},"goals":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"tier":{"type":"string","enum":["operating","bonus"]},"targetCents":{"type":"integer"},"cumulativeTargetCents":{"type":"integer"},"creature":{"type":"string"},"fundedCents":{"type":"integer"},"remainingCents":{"type":"integer"},"status":{"type":"string","enum":["funded","active","upcoming"]}}}}}}}}}}}},"/api/health":{"get":{"operationId":"healthCheck","summary":"Health check","description":"Checks server and database connection status.","responses":{"200":{"description":"Server is healthy","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","example":"ok"}}}}}}}}}}}