Calendar & Booking
Interne kalender met resources en bookings. Basis voor afspraken (#245), restaurant/hotel (#1188), externe sync (#1187) en MCP-boekingen (#1189). Alle datetimes in UTC.
Endpoints (15)
Maak of wijzig een kalender. Zonder calendar_id = aanmaken (name verplicht), met calendar_id = bijwerken.
| Field | Type | Required | Description |
|---|---|---|---|
calendar_id |
integer | No | ID van bestaande kalender (weglaten bij aanmaken). |
name |
string | No | Kalendernaam. Verplicht bij aanmaken. |
slug |
string | No | URL-slug. Wordt afgeleid van name als leeg; uniek per project. |
timezone |
string | No | IANA timezone voor rendering (default Europe/Amsterdam). Opslag blijft UTC. |
color |
string | No | Hex-kleur voor UI, bijv. #1B4332. |
source_of_truth |
boolean | No | Bij sync-conflicten wint deze kalender (sync-engine #1187). |
Alle kalenders van dit project.
No input parameters required.
Verwijder een kalender inclusief events. Weigert als er nog resources aan hangen.
| Field | Type | Required | Description |
|---|---|---|---|
calendar_id |
integer | ✓ Yes | ID van de te verwijderen kalender. |
Maak of wijzig een event. Zonder event_id = aanmaken (calendar_id, title, start_at, end_at verplicht). Datetimes zonder offset worden als UTC gelezen.
| Field | Type | Required | Description |
|---|---|---|---|
event_id |
integer | No | ID van bestaand event (weglaten bij aanmaken). |
calendar_id |
integer | No | Doelkalender. Verplicht bij aanmaken. |
title |
string | No | Titel. Verplicht bij aanmaken. |
description |
string | No | Omschrijving. |
location |
string | No | Locatie. |
start_at |
string | No | Start (UTC), bijv. 2026-09-01 18:00:00. Verplicht bij aanmaken. |
end_at |
string | No | Einde (UTC), moet na start_at liggen. Verplicht bij aanmaken. |
all_day |
boolean | No | Hele-dag event. |
status |
string | No | confirmed | tentative | cancelled (default confirmed). |
Verwijder een event.
| Field | Type | Required | Description |
|---|---|---|---|
event_id |
integer | ✓ Yes | ID van het te verwijderen event. |
Events die het venster [from, to) raken (overlap), optioneel per kalender.
| Field | Type | Required | Description |
|---|---|---|---|
from |
string | ✓ Yes | Vensterbegin (UTC). |
to |
string | ✓ Yes | Venstereinde (UTC), na from. |
calendar_id |
integer | No | Beperk tot één kalender. |
Maak of wijzig een boekbare resource (stoel/tafel/kamer). Zonder resource_id = aanmaken (calendar_id, type, name verplicht).
| Field | Type | Required | Description |
|---|---|---|---|
resource_id |
integer | No | ID van bestaande resource (weglaten bij aanmaken). |
calendar_id |
integer | No | Kalender waar claims als events op landen. Verplicht bij aanmaken. |
type |
string | No | Resource-type: chair | table | room (vrij uitbreidbaar, lowercase a-z/_). Verplicht bij aanmaken. |
name |
string | No | Naam, bijv. "Tafel 4" of "Kamer 12". Verplicht bij aanmaken. |
capacity |
integer | No | Capaciteit (personen), default 1. |
config |
array | No | Type-specifieke config. table: {min_party, max_party, seating_minutes, shifts}. room: {room_type, min_stay_nights, checkin_time, checkout_time}. chair: {service_ids}. |
active |
boolean | No | Inactieve resources zijn niet boekbaar. |
Alle resources van dit project, optioneel gefilterd.
| Field | Type | Required | Description |
|---|---|---|---|
type |
string | No | Filter op type (chair/table/room/...). |
active_only |
boolean | No | Alleen actieve resources. |
Beschikbaarheidsregels per resource (generalisatie van #245).
| Field | Type | Required | Description |
|---|---|---|---|
resource_id |
integer | ✓ Yes | Resource waarvoor de regels gelden. |
rules |
array | ✓ Yes | Regels-object: {weekdays: {mon:[{from:"09:00",to:"17:00"}], ...}, slot_minutes: 30, exceptions: [{date:"2026-12-25", closed:true}], vacations: [{from:"2026-08-01", to:"2026-08-14"}]}. Tijden in de kalender-timezone. |
Bookings van dit project met filters en paginering.
| Field | Type | Required | Description |
|---|---|---|---|
status |
string | No | pending | confirmed | completed | cancelled | no_show. |
resource_id |
integer | No | Filter op resource. |
from |
string | No | Alleen bookings die eindigen na dit moment (UTC). |
to |
string | No | Alleen bookings die starten vóór dit moment (UTC). |
page |
integer | No | Pagina (default 1). |
per_page |
integer | No | Per pagina (default 25, max 100). |
Wijzig de status van een booking (bijv. confirmed → completed of no_show).
| Field | Type | Required | Description |
|---|---|---|---|
booking_id |
integer | ✓ Yes | ID van de booking. |
status |
string | ✓ Yes | pending | confirmed | completed | cancelled | no_show. |
Verwijder een resource inclusief availability. Weigert bij toekomstige pending/confirmed bookings; historische bookings blijven bewaard.
| Field | Type | Required | Description |
|---|---|---|---|
resource_id |
integer | ✓ Yes | ID van de te verwijderen resource. |
Beschikbare slots (of nachten voor rooms) per resource. Geef resource_id of type, plus date of from/to (max 31 dagen). Slots komen terug in UTC én lokale kalendertijd.
| Field | Type | Required | Description |
|---|---|---|---|
resource_id |
integer | No | Eén specifieke resource. |
type |
string | No | Alle actieve resources van dit type (chair/table/room/...). |
date |
string | No | Eén dag, YYYY-MM-DD (kalender-timezone). |
from |
string | No | Begin van datumrange, YYYY-MM-DD. |
to |
string | No | Einde van datumrange, YYYY-MM-DD (max 31 dagen). |
party_size |
integer | No | Filter resources op capaciteit en min/max party. |
Boek een resource. Tafels/stoelen: start_at + end_at (UTC). Kamers: checkin + checkout (YYYY-MM-DD, nacht-granulariteit). Claim is transactioneel — dubbelboeking onmogelijk. Response bevat cancel_token.
| Field | Type | Required | Description |
|---|---|---|---|
resource_id |
integer | ✓ Yes | Te boeken resource. |
start_at |
string | No | Start (UTC) — verplicht voor slot-resources (chair/table). |
end_at |
string | No | Einde (UTC) — verplicht voor slot-resources. |
checkin |
string | No | Check-in datum YYYY-MM-DD — verplicht voor rooms. |
checkout |
string | No | Check-out datum YYYY-MM-DD — verplicht voor rooms, na checkin. |
party_size |
integer | No | Aantal personen; gevalideerd tegen capaciteit en min/max party. |
service_id |
integer | No | Optionele dienst (#245 afspraken-vertical). |
visitor_name |
string | ✓ Yes | Naam van de boeker. |
visitor_email |
string | No | E-mail van de boeker (voor bevestiging). |
visitor_phone |
string | No | Telefoonnummer. |
notes |
string | No | Opmerkingen (allergieën, voorkeuren, ...). |
source |
string | No | web | mcp | admin | voice (default mcp). |
ignore_availability |
boolean | No | Admin-optie: boek buiten de availability-windows om (claim-check blijft altijd actief). |
Annuleer een booking via cancel_token (bezoeker) of booking_id (beheer). Idempotent; completed/no_show is niet annuleerbaar. Het gekoppelde event gaat mee naar cancelled.
| Field | Type | Required | Description |
|---|---|---|---|
cancel_token |
string | No | Token uit de book-response/bevestiging. |
booking_id |
integer | No | Alternatief voor beheer: direct op ID. |
MCP Tool Names
When using this integration through an AI assistant (Claude, ChatGPT, Cursor, etc.), the endpoints are available as MCP tools:
| Endpoint | MCP Tool Name |
|---|---|
| upsert-calendar | calendar_upsert_calendar |
| list-calendars | calendar_list_calendars |
| delete-calendar | calendar_delete_calendar |
| upsert-event | calendar_upsert_event |
| delete-event | calendar_delete_event |
| list-events | calendar_list_events |
| upsert-resource | calendar_upsert_resource |
| list-resources | calendar_list_resources |
| set-availability | calendar_set_availability |
| list-bookings | calendar_list_bookings |
| update-booking-status | calendar_update_booking_status |
| delete-resource | calendar_delete_resource |
| get-slots | calendar_get_slots |
| book | calendar_book |
| cancel-booking | calendar_cancel_booking |
Website