{
  "openapi": "3.1.0",
  "info": {
    "title": "Voyando API",
    "version": "0.4.2",
    "description": "De Voyando API geeft toegang tot accommodaties, boekingen, beschikbaarheid, tarieven en accountgegevens. De onderdelen volgen de indeling van het dashboard.\n\n## Authenticatie en toegang\nGebruik HTTPS met `Authorization: Bearer <api_key>`. Maak een key aan onder **Account → API Keys** in het dashboard en sla de eenmalig getoonde secret veilig op. Elke key geeft volledige toegang tot de aangeboden functies voor het eigen account en alle huidige en toekomstige accommodaties. Keys hebben geen vervaldatum en kunnen in het dashboard worden ingetrokken. Overgedragen accommodaties zijn niet meer toegankelijk.\n\nAPI-toegang moet voor het account zijn geactiveerd; schrijftoegang wordt afzonderlijk ingeschakeld. Een ongeldige, ingetrokken of verkeerde test-/livekey geeft 401. Ontbrekende accounttoegang geeft 403; tijdelijk uitgeschakelde API- of schrijftoegang geeft 503. Stuur keys nooit in URL’s, cookies of requestbodies. Gebruik de API vanuit een vertrouwde serveromgeving; brede CORS-toegang voor browserapps wordt niet aangeboden.\n\n## Requests en validatie\nVeldnamen zijn Engels; requests en responses gebruiken JSON. URL’s eindigen op een slash. Datums gebruiken `YYYY-MM-DD`, tijdstempels UTC met `Z` en lokale aankomst-/vertrektijden exact `HH:MM:SS`, zonder datum of tijdzone. Geld en coördinaten zijn decimale strings. De schemas beschrijven typen, lengtes, toegestane waarden en verplichte velden.\n\nBij PATCH blijven ontbrekende velden behouden; `null` is uitsluitend toegestaan waar het schema dit aangeeft. Onbekende velden, filters en ongeldige waarden geven 400. Een ongeldige wijziging wordt geheel afgewezen. De maximale requestbody is 64 KiB. Bestaande gegevens die niet aan het responsecontract voldoen kunnen 409 geven en moeten in het dashboard worden gecorrigeerd.\n\n## Paginering en datumbereiken\nLijsten gebruiken cursorpaginering met standaard 25 en maximaal 100 resultaten. Gebruik de links `next` en `previous`; er is geen `count`. Sorteervolgorde is oplopend op ID. Filtergrenzen zijn inclusief en filters worden gecombineerd met AND. Kalenderbereiken `[from, to)` omvatten de begindatum en sluiten de einddatum uit, met maximaal 366 nachten.\n\n## Wijzigingen en herhaalde requests\nLees vóór een wijziging de actuele resource en de `ETag`-header. Stuur die waarde inclusief aanhalingstekens als `If-Match` bij PATCH, DELETE en boekingsacties. Zonder vereiste header volgt 428; bij een verouderde waarde 412. Haal de resource dan opnieuw op. Tariefwijzigingen gebruiken de ETag van GET met hetzelfde datumbereik.\n\nMuterende POST-requests vereisen een unieke `Idempotency-Key`. Dezelfde key, route, payload en eventuele If-Match herhalen gedurende 24 uur het oorspronkelijke resultaat; afwijkende inhoud geeft 409. Bewaar deze key voor retries na een onzekere uitkomst. Prijsberekeningen en beschikbaarheidschecks wijzigen geen gegevens en vereisen deze header niet.\n\n## Limieten en retries\nPer API-key zijn 60 requests per minuut beschikbaar; per account geldt 300 voor alle keys samen. Voor POST, PATCH en DELETE geldt aanvullend 20 requests per minuut per key, inclusief prijsberekeningen en beschikbaarheidschecks. Het tegoed wordt geleidelijk aangevuld; korte pieken zijn mogelijk.\n\nOverschrijding geeft 429 met `Retry-After` in seconden; de operatie wordt dan niet uitgevoerd. Tijdelijke onbeschikbaarheid geeft 503, met Retry-After wanneer beschikbaar. Respecteer deze header. Gebruik bij netwerkfouten of 502/503/504 exponentiële back-off met jitter en een beperkt aantal retries. Gebruik bij mutaties opnieuw dezelfde idempotency-key of controleer eerst de actuele resource. Andere 4xx-responses vragen correctie van het request. Proxyfouten kunnen een niet-JSON-response geven.\n\n## Boekingen en prijzen\nDe instelling voor automatisch accepteren bepaalt de beginstatus van een directe boeking. Gastbevestigingen en kanaalsynchronisatie worden asynchroon verwerkt; `notify_guest` bepaalt de gastmelding bij boekingsacties. De API start geen betaalverzoeken, incasso’s of refunds.\n\nWijzig OTA-boekingen bij de bron. Herprijzen met bestaande betaalverzoeken of handmatig vastgelegde prijsregels geeft 409 en vereist afhandeling in het dashboard. Tariefwijzigingen ondersteunen nachtprijzen; overlappende periodes en pakketprijzen geven 409. Een quote is een momentopname en reserveert geen beschikbaarheid of prijs. Kortingen zijn al verwerkt in de bedragen; tel ze niet nogmaals af. De borg staat apart. Het betaalplan is indicatief.\n\n## Synchronisatie\nVraag eerst `/changes/` zonder cursor op voor een watermark. Lees vervolgens de volledige lijsten en vervolg de feed vanaf dat watermark. Bewaar de cursor ook bij lege resultaten. De historie is 30 dagen beschikbaar; een verlopen cursor of ontbrekende historie geeft 410 en vereist opnieuw synchroniseren. Niet alle wijzigingen uit externe of achtergrondprocessen verschijnen gegarandeerd in de feed; vergelijk daarom periodiek met de volledige resources.\n\n## Foutafhandeling\nFouten bevatten `error.code`, `error.message` en `error.request_id`, met waar beschikbaar veldfouten. Gebruik het request-ID bij een supportvraag. Niet-ondersteunde methoden geven 405. HEAD volgt GET zonder body; OPTIONS retourneert geen klantgegevens. Responses mogen niet worden gecachet."
  },
  "servers": [
    {
      "url": "/api/v1",
      "description": "API op hetzelfde domein als deze documentatie."
    }
  ],
  "security": [
    {
      "BearerAuth": []
    }
  ],
  "tags": [
    {
      "name": "Mijn Accommodatie / Algemeen",
      "x-displayName": "Algemeen",
      "description": "Accommodaties en algemene gegevens; toegestane types staan bij het veld, zonder aparte typeroute."
    },
    {
      "name": "Mijn Accommodatie / Locatie",
      "x-displayName": "Locatie",
      "description": "Adres en coördinaten; landkeuze staat bij het veld, zonder aparte landenroute."
    },
    {
      "name": "Mijn Accommodatie / Teksten",
      "x-displayName": "Teksten",
      "description": "Accommodatieteksten lezen en wijzigen."
    },
    {
      "name": "Mijn Accommodatie / Foto’s",
      "x-displayName": "Foto’s",
      "description": "Afbeeldingen, volgorde en alt-tekst."
    },
    {
      "name": "Mijn Accommodatie / Indeling",
      "x-displayName": "Indeling",
      "description": "Kamers en bedden; geen afzonderlijk boekbare units."
    },
    {
      "name": "Mijn Accommodatie / Faciliteiten",
      "x-displayName": "Faciliteiten",
      "description": "Eén lijst met de geselecteerde faciliteiten van de accommodatie."
    },
    {
      "name": "Mijn Accommodatie / Huisregels",
      "x-displayName": "Huisregels",
      "description": "Huisregels van de accommodatie."
    },
    {
      "name": "Mijn Accommodatie / Voorwaarden",
      "x-displayName": "Voorwaarden",
      "description": "Voorwaarden per taal lezen en wijzigen."
    },
    {
      "name": "Mijn Accommodatie / Betalingsvoorwaarden",
      "x-displayName": "Betalingsvoorwaarden",
      "description": "Betalingstermijnen, aanbetaling, herinneringen en factuurinstellingen."
    },
    {
      "name": "Mijn Accommodatie / Reviews",
      "x-displayName": "Reviews",
      "description": "Reviews ophalen en handmatig toevoegen zoals in het dashboard."
    },
    {
      "name": "Boekingen & Prijzen / Boekingen",
      "x-displayName": "Boekingen",
      "description": "Boekingen lezen, aanmaken, wijzigen, accepteren, afwijzen en annuleren."
    },
    {
      "name": "Boekingen & Prijzen / Beschikbaarheid",
      "x-displayName": "Beschikbaarheid",
      "description": "Beschikbaarheid, verblijfscontrole en handmatige blokkades."
    },
    {
      "name": "Boekingen & Prijzen / Tarieven",
      "x-displayName": "Tarieven",
      "description": "Nachtprijzen, restricties en prijsberekening voor een verblijf."
    },
    {
      "name": "Gasten / Overzicht",
      "x-displayName": "Overzicht",
      "description": "Gasten die horen bij boekingen binnen het eigen account."
    },
    {
      "name": "Inbox / Berichten",
      "x-displayName": "Berichten",
      "description": "Gesprekken en berichten alleen lezen."
    },
    {
      "name": "Profiel verhuurder / Profiel",
      "x-displayName": "Profiel",
      "description": "Profielgegevens en verhuurdersbeschrijving lezen en wijzigen."
    },
    {
      "name": "Account / API Keys",
      "x-displayName": "API Keys",
      "description": "Wijzigingsfeed voor synchronisatie. API-keys aanmaken, naam wijzigen en intrekken gebeurt onder Account → API Keys in het dashboard."
    },
    {
      "name": "Gebruikers / Overzicht",
      "x-displayName": "Overzicht",
      "description": "Subgebruikers en hun rechten binnen het eigen account."
    },
    {
      "name": "Financieel / Transacties",
      "x-displayName": "Transacties",
      "description": "Betaaloverzicht per boeking."
    }
  ],
  "paths": {
    "/accommodations/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Algemeen"
        ],
        "summary": "Alle accommodaties ophalen",
        "description": "Alle huidige accommodaties van de eigenaar; nieuw toegevoegde accommodaties zijn automatisch toegankelijk. Overgedragen accommodaties vallen direct buiten bereik. Bestaande gegevens die niet aan het contract voldoen geven 409; corrigeer deze in het dashboard.",
        "operationId": "listAccommodations",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccommodationPage"
                },
                "example": {
                  "results": [
                    {
                      "id": 123,
                      "name": "Villa Voorbeeld",
                      "type": "villa",
                      "timezone": "Europe/Amsterdam",
                      "currency": "EUR",
                      "updated_at": "2026-09-29T10:00:00Z"
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/accommodations/{accommodation_id}/general/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Algemeen"
        ],
        "summary": "Algemene gegevens ophalen",
        "description": "Bestaande gegevens die niet aan het contract voldoen geven 409; corrigeer deze in het dashboard.",
        "operationId": "getAccommodationGeneral",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccommodationGeneral"
                },
                "example": {
                  "id": 123,
                  "name": "Villa Voorbeeld",
                  "type": "villa",
                  "timezone": "Europe/Amsterdam",
                  "currency": "EUR",
                  "updated_at": "2026-09-29T10:00:00Z",
                  "title": {
                    "nl": "Villa aan het water",
                    "en": "Lakeside villa"
                  },
                  "subtitle": {
                    "nl": "Rust en ruimte"
                  },
                  "languages": [
                    "nl",
                    "en"
                  ],
                  "default_language": "nl",
                  "starting_price": "125.00",
                  "default_vat": "9.0",
                  "max_persons": 6,
                  "max_babies": 1,
                  "max_pets": 0,
                  "baby_max_age": 2,
                  "child_max_age": 17,
                  "checkin_start": "15:00:00",
                  "checkin_end": null,
                  "checkout_start": null,
                  "checkout_end": "10:00:00",
                  "show_checkin_times": true,
                  "smoking": false,
                  "parties_events": false,
                  "auto_approve_bookings": false,
                  "max_booking_days_ahead": 730
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Mijn Accommodatie / Algemeen"
        ],
        "summary": "Algemene gegevens wijzigen",
        "description": "Wijzig de opgegeven algemene gegevens. Tijden gebruiken exact HH:MM:SS zonder datum of tijdzone. checkin_start en checkout_end mogen niet null zijn; checkin_end en checkout_start wel. Tijden worden afzonderlijk gevalideerd. default_language moet in languages staan; baby_max_age moet kleiner zijn dan child_max_age. Capaciteiten zijn niet-negatief. max_booking_days_ahead=null wordt 730. Vertalingen zijn alleen toegestaan voor de geselecteerde talen. De volledige wijziging wordt atomair toegepast.",
        "operationId": "updateAccommodationGeneral",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccommodationGeneral"
                },
                "example": {
                  "id": 123,
                  "name": "Villa Voorbeeld",
                  "type": "villa",
                  "timezone": "Europe/Amsterdam",
                  "currency": "EUR",
                  "updated_at": "2026-09-29T10:00:00Z",
                  "title": {
                    "nl": "Villa aan het water",
                    "en": "Lakeside villa"
                  },
                  "subtitle": {
                    "nl": "Rust en ruimte"
                  },
                  "languages": [
                    "nl",
                    "en"
                  ],
                  "default_language": "nl",
                  "starting_price": "125.00",
                  "default_vat": "9.0",
                  "max_persons": 6,
                  "max_babies": 1,
                  "max_pets": 0,
                  "baby_max_age": 2,
                  "child_max_age": 17,
                  "checkin_start": "15:00:00",
                  "checkin_end": null,
                  "checkout_start": null,
                  "checkout_end": "10:00:00",
                  "show_checkin_times": true,
                  "smoking": false,
                  "parties_events": false,
                  "auto_approve_bookings": false,
                  "max_booking_days_ahead": 730
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccommodationGeneralPatch"
              },
              "example": {
                "name": "Villa aan zee",
                "checkin_start": "15:00:00",
                "checkin_end": "20:00:00",
                "checkout_start": null,
                "checkout_end": "10:00:00"
              }
            }
          }
        }
      }
    },
    "/reference/languages/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Algemeen"
        ],
        "summary": "Talen ophalen",
        "operationId": "listReferenceLanguages",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReferenceItemPage"
                },
                "example": {
                  "results": [
                    {
                      "code": "NL",
                      "label": {
                        "nl": "Nederland",
                        "en": "Netherlands"
                      }
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/reference/currencies/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Algemeen"
        ],
        "summary": "Valuta’s ophalen",
        "description": "Valutacodes die door Voyando worden ondersteund.",
        "operationId": "listReferenceCurrencies",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReferenceItemPage"
                },
                "example": {
                  "results": [
                    {
                      "code": "NL",
                      "label": {
                        "nl": "Nederland",
                        "en": "Netherlands"
                      }
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/accommodations/{accommodation_id}/location/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Locatie"
        ],
        "summary": "Locatiegegevens ophalen",
        "description": "",
        "operationId": "getAccommodationLocation",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccommodationLocation"
                },
                "example": {
                  "id": 123,
                  "street": "Voorbeeldstraat",
                  "house_number": "12",
                  "house_number_addition": null,
                  "postal_code": "1234AB",
                  "place": "Voorbeeldstad",
                  "country": "NL",
                  "lat": "52.1000000",
                  "lon": "5.1000000",
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Mijn Accommodatie / Locatie"
        ],
        "summary": "Locatiegegevens wijzigen",
        "description": "Adreswijziging zonder coördinaten wist lat/lon. Geef beide coördinaten samen op of beide null. Er vindt geen automatische geocoding plaats.",
        "operationId": "updateAccommodationLocation",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccommodationLocation"
                },
                "example": {
                  "id": 123,
                  "street": "Voorbeeldstraat",
                  "house_number": "12",
                  "house_number_addition": null,
                  "postal_code": "1234AB",
                  "place": "Voorbeeldstad",
                  "country": "NL",
                  "lat": "52.1000000",
                  "lon": "5.1000000",
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AccommodationLocationPatch"
              },
              "example": {
                "street": "Nieuwe straat",
                "house_number": "8"
              }
            }
          }
        }
      }
    },
    "/accommodations/{accommodation_id}/content/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Teksten"
        ],
        "summary": "Beschrijving ophalen",
        "description": "Teksten per taal; client kiest taal en valt terug op default_language.",
        "operationId": "getAccommodationContent",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Content"
                },
                "example": {
                  "accommodation_id": 123,
                  "description": {
                    "nl": "<p>Welkom in onze villa.</p>"
                  },
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Mijn Accommodatie / Teksten"
        ],
        "summary": "Beschrijving wijzigen",
        "description": "Uitsluitend Object.description per taal wijzigen, zoals Mijn Accommodatie → Teksten. Geen price_list. Gevalideerde/schone rich text volgens dezelfde HTML-allowlist als het dashboard; onbekende velden geven 400.",
        "operationId": "updateAccommodationContent",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Content"
                },
                "example": {
                  "accommodation_id": 123,
                  "description": {
                    "nl": "<p>Welkom in onze villa.</p>"
                  },
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ContentPatch"
              },
              "example": {
                "description": {
                  "nl": "<p>Onze vernieuwde villa.</p>"
                }
              }
            }
          }
        }
      }
    },
    "/accommodations/{accommodation_id}/images/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Foto’s"
        ],
        "summary": "Afbeeldingen ophalen",
        "description": "Teksten per taal; client kiest taal en valt terug op default_language.",
        "operationId": "getAccommodationImages",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ImagePage"
                },
                "example": {
                  "results": [
                    {
                      "id": 21,
                      "url": "https://images.example.com/villa.jpg",
                      "alt": "Buitenzijde villa",
                      "position": 0,
                      "width": 1600,
                      "height": 900
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/accommodations/{accommodation_id}/rooms/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Indeling"
        ],
        "summary": "Indeling ophalen",
        "description": "Teksten per taal; client kiest taal en valt terug op default_language. Kamers beschrijven inrichting, geen afzonderlijk boekbare inventaris.",
        "operationId": "getAccommodationRooms",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RoomPage"
                },
                "example": {
                  "results": [
                    {
                      "id": 31,
                      "accommodation_id": 123,
                      "type": "bedroom",
                      "name": {
                        "nl": "Slaapkamer 1"
                      },
                      "situation": "begane_grond",
                      "surface": 18,
                      "beds": [
                        {
                          "id": 71,
                          "type": "2pers_bed",
                          "number": 1
                        }
                      ]
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/accommodations/{accommodation_id}/rooms/{room_id}/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Indeling"
        ],
        "summary": "Ruimte ophalen",
        "description": "Lees de kamer en ETag voordat je deze wijzigt of verwijdert.",
        "operationId": "getAccommodationRoom",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Room"
                },
                "example": {
                  "id": 31,
                  "accommodation_id": 123,
                  "type": "bedroom",
                  "name": {
                    "nl": "Slaapkamer 1"
                  },
                  "situation": "begane_grond",
                  "surface": 18,
                  "beds": [
                    {
                      "id": 71,
                      "type": "2pers_bed",
                      "number": 1
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "room_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Mijn Accommodatie / Indeling"
        ],
        "summary": "Ruimte wijzigen",
        "description": "Wijzig de eigenschappen van de ruimte. De accommodatie, eigenaar, ID en bedden zijn niet wijzigbaar via deze route. surface is een niet-negatief geheel aantal m².",
        "operationId": "updateAccommodationRoom",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Room"
                },
                "example": {
                  "id": 31,
                  "accommodation_id": 123,
                  "type": "bedroom",
                  "name": {
                    "nl": "Slaapkamer 1"
                  },
                  "situation": "begane_grond",
                  "surface": 18,
                  "beds": [
                    {
                      "id": 71,
                      "type": "2pers_bed",
                      "number": 1
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "room_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RoomPatch"
              },
              "example": {
                "name": {
                  "nl": "Slaapkamer aan de tuin"
                },
                "surface": 20
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Mijn Accommodatie / Indeling"
        ],
        "summary": "Ruimte verwijderen",
        "description": "Verwijdert Room en bijbehorende Bed-records via CASCADE. Foto’s blijven bestaan; hun room-relatie wordt null. Controleer eigendom van zowel accommodatie als kamer; transactioneel uitvoeren.",
        "operationId": "deleteAccommodationRoom",
        "responses": {
          "204": {
            "description": "Verwijderd; geen responsebody.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "room_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ]
      }
    },
    "/accommodations/{accommodation_id}/facilities/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Faciliteiten"
        ],
        "summary": "Faciliteiten ophalen",
        "description": "Eén lijst met de faciliteiten van deze accommodatie, inclusief aantal/opmerking waar van toepassing. Alleen de bestaande ObjectFeature-relaties; geen tweede catalogusroute.",
        "operationId": "getAccommodationFacilities",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/FacilityPage"
                },
                "example": {
                  "results": [
                    {
                      "id": 12,
                      "name": {
                        "nl": "Wifi"
                      },
                      "count": null,
                      "comment": null,
                      "icon": "fas fa-wifi"
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/accommodations/{accommodation_id}/rules/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Huisregels"
        ],
        "summary": "Huisregels ophalen",
        "description": "Teksten per taal; client kiest taal en valt terug op default_language.",
        "operationId": "getAccommodationRules",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rules"
                },
                "example": {
                  "accommodation_id": 123,
                  "description": {
                    "nl": "Rust na 22:00 uur."
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Mijn Accommodatie / Huisregels"
        ],
        "summary": "Huisregels wijzigen",
        "description": "Alleen het overeenkomstige vertaalde dashboardveld wijzigen; veilige HTML en server-side vertalingsvalidatie vóór opslag.",
        "operationId": "updateAccommodationRules",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rules"
                },
                "example": {
                  "accommodation_id": 123,
                  "description": {
                    "nl": "Rust na 22:00 uur."
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RulesPatch"
              },
              "example": {
                "description": {
                  "nl": "Rust na 22:00 uur."
                }
              }
            }
          }
        }
      }
    },
    "/accommodations/{accommodation_id}/conditions/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Voorwaarden"
        ],
        "summary": "Voorwaarden ophalen",
        "description": "Teksten per taal; client kiest taal en valt terug op default_language.",
        "operationId": "getAccommodationConditions",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Conditions"
                },
                "example": {
                  "accommodation_id": 123,
                  "conditions": {
                    "nl": "<p>Onze boekingsvoorwaarden.</p>"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Mijn Accommodatie / Voorwaarden"
        ],
        "summary": "Voorwaarden wijzigen",
        "description": "Alleen het overeenkomstige vertaalde dashboardveld wijzigen; veilige HTML en server-side vertalingsvalidatie vóór opslag.",
        "operationId": "updateAccommodationConditions",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Conditions"
                },
                "example": {
                  "accommodation_id": 123,
                  "conditions": {
                    "nl": "<p>Onze boekingsvoorwaarden.</p>"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConditionsPatch"
              },
              "example": {
                "conditions": {
                  "nl": "<p>Onze boekingsvoorwaarden.</p>"
                }
              }
            }
          }
        }
      }
    },
    "/accommodations/{accommodation_id}/payment-conditions/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Betalingsvoorwaarden"
        ],
        "summary": "Betalingsvoorwaarden ophalen",
        "description": "Betalingsvoorwaarden van de accommodatie. invoice_logo_url is alleen-lezen; uploaden van een logo wordt niet aangeboden via deze route.",
        "operationId": "getPaymentConditions",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentConditions"
                },
                "example": {
                  "accommodation_id": 123,
                  "active": true,
                  "cutoff": 42,
                  "remaining_payment_send_days": 42,
                  "percentage": 50,
                  "payment_term": 0,
                  "reminder_interval": 7,
                  "automatic_mails": "automatic",
                  "subject_to_vat": false,
                  "vat": 0,
                  "invoice_text": {
                    "nl": "Dank voor je boeking."
                  },
                  "invoice_logo_url": null,
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Mijn Accommodatie / Betalingsvoorwaarden"
        ],
        "summary": "Betalingsvoorwaarden wijzigen",
        "description": "Wijzig betalingsvoorwaarden en factuurinstellingen. automatic_mails wijzigen vereist een actieve financiële module; anders volgt 409. percentage ligt tussen 1 en 100, reminder_interval tussen 1 en 60. Dagtermijnen zijn niet-negatief; remaining_payment_send_days mag cutoff niet overschrijden. subject_to_vat=true met vat=null wordt vat=0. De wijziging start geen betalingen, refunds of bulkmail en herberekent geen bestaande betaalverzoeken.",
        "operationId": "updatePaymentConditions",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaymentConditions"
                },
                "example": {
                  "accommodation_id": 123,
                  "active": true,
                  "cutoff": 42,
                  "remaining_payment_send_days": 42,
                  "percentage": 50,
                  "payment_term": 0,
                  "reminder_interval": 7,
                  "automatic_mails": "automatic",
                  "subject_to_vat": false,
                  "vat": 0,
                  "invoice_text": {
                    "nl": "Dank voor je boeking."
                  },
                  "invoice_logo_url": null,
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaymentConditionsPatch"
              },
              "example": {
                "percentage": 30,
                "cutoff": 42,
                "payment_term": 7
              }
            }
          }
        }
      }
    },
    "/accommodations/{accommodation_id}/reviews/": {
      "get": {
        "tags": [
          "Mijn Accommodatie / Reviews"
        ],
        "summary": "Reviews ophalen",
        "description": "Alle reviews van de eigen accommodatie, ook verborgen reviews. Geen kanaalcredentials. Cursorpaginering op oplopend ID.",
        "operationId": "listAccommodationReviews",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ReviewPage"
                },
                "example": {
                  "results": [
                    {
                      "id": 501,
                      "accommodation_id": 123,
                      "visible": true,
                      "date": "2026-09-20",
                      "name": "Jamie Voorbeeld",
                      "overall_stars": 5,
                      "text": "Een fijn verblijf.",
                      "headline": "Veel rust",
                      "surrounding_stars": null,
                      "surrounding_review": null,
                      "facilities_stars": null,
                      "facilities_review": null,
                      "landlord_stars": null,
                      "landlord_review": null,
                      "channel": null,
                      "created_at": "2026-09-29T10:00:00Z",
                      "updated_at": "2026-09-29T10:00:00Z"
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      },
      "post": {
        "tags": [
          "Mijn Accommodatie / Reviews"
        ],
        "summary": "Review toevoegen",
        "description": "Voeg een handmatige review toe. date, name en text zijn verplicht. Sterren zijn optioneel: null of een geheel getal van 1 tot en met 5. visible is standaard true. De accommodatie volgt uit de URL; boeking en externe reviewbron zijn niet instelbaar.",
        "operationId": "createAccommodationReview",
        "responses": {
          "201": {
            "description": "Aangemaakt.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              },
              "Location": {
                "schema": {
                  "type": "string",
                  "format": "uri-reference"
                },
                "description": "URL van de accommodatie-reviewlijst."
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Review"
                },
                "example": {
                  "id": 501,
                  "accommodation_id": 123,
                  "visible": true,
                  "date": "2026-09-20",
                  "name": "Jamie Voorbeeld",
                  "overall_stars": 5,
                  "text": "Een fijn verblijf.",
                  "headline": "Veel rust",
                  "surrounding_stars": null,
                  "surrounding_review": null,
                  "facilities_stars": null,
                  "facilities_review": null,
                  "landlord_stars": null,
                  "landlord_review": null,
                  "channel": null,
                  "created_at": "2026-09-29T10:00:00Z",
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ReviewCreate"
              },
              "example": {
                "visible": true,
                "date": "2026-09-20",
                "name": "Jamie Voorbeeld",
                "overall_stars": 5,
                "text": "Een fijn verblijf."
              }
            }
          }
        }
      }
    },
    "/bookings/": {
      "get": {
        "tags": [
          "Boekingen & Prijzen / Boekingen"
        ],
        "summary": "Boekingen ophalen",
        "description": "",
        "operationId": "listBookings",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingSummaryPage"
                },
                "example": {
                  "results": [
                    {
                      "id": 456,
                      "accommodation_id": 123,
                      "status": "accepted",
                      "channel": "direct",
                      "check_in": "2026-11-01",
                      "check_out": "2026-11-08",
                      "adults": 2,
                      "kids": 0,
                      "babies": 0,
                      "pets": 0,
                      "created_at": "2026-09-29T10:00:00Z",
                      "updated_at": "2026-09-29T10:00:00Z"
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          },
          {
            "name": "accommodation_id",
            "in": "query",
            "required": false,
            "description": "Accommodatie buiten eigen account geeft 404.",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "status",
            "in": "query",
            "required": false,
            "description": "Bestaande Voyando-status.",
            "schema": {
              "type": "string",
              "enum": [
                "request",
                "accepted",
                "declined",
                "cancelled"
              ]
            }
          },
          {
            "name": "updated_since",
            "in": "query",
            "required": false,
            "description": "Inclusief. Gebruik overlap en deduplicatie; dit filter is geen verliesvrije wijzigingsfeed.",
            "schema": {
              "type": "string",
              "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
              "format": "date-time",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
            }
          },
          {
            "name": "check_in_from",
            "in": "query",
            "required": false,
            "description": "Inclusieve datumgrens; alle filters combineren met AND.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          },
          {
            "name": "check_in_to",
            "in": "query",
            "required": false,
            "description": "Inclusieve datumgrens; alle filters combineren met AND.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          },
          {
            "name": "check_out_from",
            "in": "query",
            "required": false,
            "description": "Inclusieve datumgrens; alle filters combineren met AND.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          },
          {
            "name": "check_out_to",
            "in": "query",
            "required": false,
            "description": "Inclusieve datumgrens; alle filters combineren met AND.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          }
        ]
      },
      "post": {
        "tags": [
          "Boekingen & Prijzen / Boekingen"
        ],
        "summary": "Directe boeking aanmaken",
        "description": "Prijs en beschikbaarheid worden onder accommodatievergrendeling gecontroleerd. external_reference is uniek per uitgevende key/integratie. Status volgt auto_approve_bookings. Bezetting, gast en prijsregels worden atomair opgeslagen; de gastbevestiging volgt na commit. Geen automatische betaalverzoeken, incasso of refunds.",
        "operationId": "createBooking",
        "responses": {
          "201": {
            "description": "Aangemaakt.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Location": {
                "description": "URL van de aangemaakte resource.",
                "schema": {
                  "type": "string",
                  "format": "uri-reference"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Booking"
                },
                "example": {
                  "id": 456,
                  "accommodation_id": 123,
                  "status": "accepted",
                  "channel": "direct",
                  "check_in": "2026-11-01",
                  "check_out": "2026-11-08",
                  "adults": 2,
                  "kids": 0,
                  "babies": 0,
                  "pets": 0,
                  "created_at": "2026-09-29T10:00:00Z",
                  "updated_at": "2026-09-29T10:00:00Z",
                  "guest": {
                    "first_name": "Jamie",
                    "last_name": "Voorbeeld",
                    "email": "jamie@example.com",
                    "telephone": null
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingCreate"
              },
              "example": {
                "accommodation_id": 123,
                "check_in": "2026-11-01",
                "check_out": "2026-11-08",
                "party": {
                  "adults": 2,
                  "kids": 0,
                  "babies": 0,
                  "pets": 0
                },
                "guest": {
                  "first_name": "Jamie",
                  "last_name": "Voorbeeld",
                  "email": "jamie@example.com",
                  "telephone": null
                },
                "external_reference": "my-integration-001"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/": {
      "get": {
        "tags": [
          "Boekingen & Prijzen / Boekingen"
        ],
        "summary": "Boeking ophalen",
        "description": "Inclusief minimaal gastcontact; key heeft volledige accounttoegang. Historische ontbrekende gast kan null zijn.",
        "operationId": "getBooking",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Booking"
                },
                "example": {
                  "id": 456,
                  "accommodation_id": 123,
                  "status": "accepted",
                  "channel": "direct",
                  "check_in": "2026-11-01",
                  "check_out": "2026-11-08",
                  "adults": 2,
                  "kids": 0,
                  "babies": 0,
                  "pets": 0,
                  "created_at": "2026-09-29T10:00:00Z",
                  "updated_at": "2026-09-29T10:00:00Z",
                  "guest": {
                    "first_name": "Jamie",
                    "last_name": "Voorbeeld",
                    "email": "jamie@example.com",
                    "telephone": null
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Boekingen & Prijzen / Boekingen"
        ],
        "summary": "Boeking wijzigen",
        "description": "Geen willekeurige statuswijziging of financiële actie. Verblijf/prijs worden opnieuw getoetst. Alleen bewerkbare directe boekingen; OTA-bronbeleid kan 409 geven.",
        "operationId": "updateBooking",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Booking"
                },
                "example": {
                  "id": 456,
                  "accommodation_id": 123,
                  "status": "accepted",
                  "channel": "direct",
                  "check_in": "2026-11-01",
                  "check_out": "2026-11-08",
                  "adults": 2,
                  "kids": 0,
                  "babies": 0,
                  "pets": 0,
                  "created_at": "2026-09-29T10:00:00Z",
                  "updated_at": "2026-09-29T10:00:00Z",
                  "guest": {
                    "first_name": "Jamie",
                    "last_name": "Voorbeeld",
                    "email": "jamie@example.com",
                    "telephone": null
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingPatch"
              },
              "example": {
                "check_in": "2026-11-02",
                "check_out": "2026-11-09"
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/accept/": {
      "post": {
        "tags": [
          "Boekingen & Prijzen / Boekingen"
        ],
        "summary": "Boeking accepteren",
        "description": "Toegestane overgangen: accept/decline alleen vanaf request; cancel vanaf request of accepted. Ongeldige overgang 409. Herhaling met dezelfde idempotency-key herhaalt resultaat. Bezetting/audit bijwerken; notify_guest bepaalt melding. Geen impliciete refunds.",
        "operationId": "acceptBooking",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Booking"
                },
                "example": {
                  "id": 456,
                  "accommodation_id": 123,
                  "status": "accepted",
                  "channel": "direct",
                  "check_in": "2026-11-01",
                  "check_out": "2026-11-08",
                  "adults": 2,
                  "kids": 0,
                  "babies": 0,
                  "pets": 0,
                  "created_at": "2026-09-29T10:00:00Z",
                  "updated_at": "2026-09-29T10:00:00Z",
                  "guest": {
                    "first_name": "Jamie",
                    "last_name": "Voorbeeld",
                    "email": "jamie@example.com",
                    "telephone": null
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingAction"
              },
              "example": {
                "reason": "Op verzoek van de gast",
                "notify_guest": false
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/decline/": {
      "post": {
        "tags": [
          "Boekingen & Prijzen / Boekingen"
        ],
        "summary": "Boeking afwijzen",
        "description": "Toegestane overgangen: accept/decline alleen vanaf request; cancel vanaf request of accepted. Ongeldige overgang 409. Herhaling met dezelfde idempotency-key herhaalt resultaat. Bezetting/audit bijwerken; notify_guest bepaalt melding. Geen impliciete refunds.",
        "operationId": "declineBooking",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Booking"
                },
                "example": {
                  "id": 456,
                  "accommodation_id": 123,
                  "status": "accepted",
                  "channel": "direct",
                  "check_in": "2026-11-01",
                  "check_out": "2026-11-08",
                  "adults": 2,
                  "kids": 0,
                  "babies": 0,
                  "pets": 0,
                  "created_at": "2026-09-29T10:00:00Z",
                  "updated_at": "2026-09-29T10:00:00Z",
                  "guest": {
                    "first_name": "Jamie",
                    "last_name": "Voorbeeld",
                    "email": "jamie@example.com",
                    "telephone": null
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingAction"
              },
              "example": {
                "reason": "Op verzoek van de gast",
                "notify_guest": false
              }
            }
          }
        }
      }
    },
    "/bookings/{booking_id}/cancel/": {
      "post": {
        "tags": [
          "Boekingen & Prijzen / Boekingen"
        ],
        "summary": "Boeking annuleren",
        "description": "Toegestane overgangen: accept/decline alleen vanaf request; cancel vanaf request of accepted. Ongeldige overgang 409. Herhaling met dezelfde idempotency-key herhaalt resultaat. Bezetting/audit bijwerken; notify_guest bepaalt melding. Geen impliciete refunds.",
        "operationId": "cancelBooking",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Booking"
                },
                "example": {
                  "id": 456,
                  "accommodation_id": 123,
                  "status": "accepted",
                  "channel": "direct",
                  "check_in": "2026-11-01",
                  "check_out": "2026-11-08",
                  "adults": 2,
                  "kids": 0,
                  "babies": 0,
                  "pets": 0,
                  "created_at": "2026-09-29T10:00:00Z",
                  "updated_at": "2026-09-29T10:00:00Z",
                  "guest": {
                    "first_name": "Jamie",
                    "last_name": "Voorbeeld",
                    "email": "jamie@example.com",
                    "telephone": null
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BookingAction"
              },
              "example": {
                "reason": "Op verzoek van de gast",
                "notify_guest": false
              }
            }
          }
        }
      }
    },
    "/accommodations/{accommodation_id}/availability/": {
      "get": {
        "tags": [
          "Boekingen & Prijzen / Beschikbaarheid"
        ],
        "summary": "Beschikbaarheid ophalen",
        "description": "Een vrije nacht garandeert geen boekbaar verblijf. Geen gastinformatie of privéblokkeringsreden. Externe synchronisatie kan vertraagd zijn.",
        "operationId": "getAvailability",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AvailabilityCalendar"
                },
                "example": {
                  "accommodation_id": 123,
                  "timezone": "Europe/Amsterdam",
                  "from": "2026-11-01",
                  "to": "2026-11-02",
                  "days": [
                    {
                      "date": "2026-11-01",
                      "available": true,
                      "arrival_allowed": true,
                      "departure_allowed": true,
                      "min_stay": 3,
                      "max_stay": null
                    }
                  ],
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": true,
            "description": "Inclusief; lokale nacht in accommodatietijdzone.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "description": "Exclusief; maximaal 366 nachten na from.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          }
        ]
      }
    },
    "/availability/check/": {
      "post": {
        "tags": [
          "Boekingen & Prijzen / Beschikbaarheid"
        ],
        "summary": "Boekbaarheid van verblijf controleren",
        "description": "Berekening zonder reservering of andere mutatie. check_out moet na check_in liggen. Maximaal 20 accommodaties. Deze POST telt mee voor de limiet van 20 POST/PATCH/DELETE-requests per minuut per key.",
        "operationId": "checkAvailability",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AvailabilityCheck"
                },
                "example": {
                  "results": [
                    {
                      "accommodation_id": 123,
                      "bookable": true,
                      "reasons": []
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AvailabilityCheckInput"
              },
              "example": {
                "accommodation_ids": [
                  123
                ],
                "check_in": "2026-11-01",
                "check_out": "2026-11-08",
                "party": {
                  "adults": 2
                }
              }
            }
          }
        }
      }
    },
    "/accommodations/{accommodation_id}/blocks/": {
      "get": {
        "tags": [
          "Boekingen & Prijzen / Beschikbaarheid"
        ],
        "summary": "Eigen handmatige blokkades ophalen",
        "description": "Alleen handmatige blokkades binnen dit account; geen booking-/iCal-/OTA-bezettingen.",
        "operationId": "listBlocks",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BlockPage"
                },
                "example": {
                  "results": [
                    {
                      "check_in": "2026-12-01",
                      "check_out": "2026-12-04",
                      "label": "Eigen gebruik",
                      "id": 81,
                      "accommodation_id": 123,
                      "updated_at": "2026-09-29T10:00:00Z"
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      },
      "post": {
        "tags": [
          "Boekingen & Prijzen / Beschikbaarheid"
        ],
        "summary": "Handmatige blokkade aanmaken",
        "description": "Lokale nachten [check_in, check_out); vertrekdatum exclusief. Conflicten 409.",
        "operationId": "createBlock",
        "responses": {
          "201": {
            "description": "Aangemaakt.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "Location": {
                "description": "URL van de aangemaakte resource.",
                "schema": {
                  "type": "string",
                  "format": "uri-reference"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Block"
                },
                "example": {
                  "check_in": "2026-12-01",
                  "check_out": "2026-12-04",
                  "label": "Eigen gebruik",
                  "id": 81,
                  "accommodation_id": 123,
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BlockInput"
              },
              "example": {
                "check_in": "2026-12-01",
                "check_out": "2026-12-04",
                "label": "Eigen gebruik"
              }
            }
          }
        }
      }
    },
    "/accommodations/{accommodation_id}/blocks/{block_id}/": {
      "get": {
        "tags": [
          "Boekingen & Prijzen / Beschikbaarheid"
        ],
        "summary": "Handmatige blokkade ophalen",
        "description": "Haal de handmatige blokkade en de actuele ETag op vóór wijzigen of verwijderen.",
        "operationId": "getBlock",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Block"
                },
                "example": {
                  "check_in": "2026-12-01",
                  "check_out": "2026-12-04",
                  "label": "Eigen gebruik",
                  "id": 81,
                  "accommodation_id": 123,
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "block_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Boekingen & Prijzen / Beschikbaarheid"
        ],
        "summary": "Handmatige blokkade wijzigen",
        "description": "",
        "operationId": "updateBlock",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Block"
                },
                "example": {
                  "check_in": "2026-12-01",
                  "check_out": "2026-12-04",
                  "label": "Eigen gebruik",
                  "id": 81,
                  "accommodation_id": 123,
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "block_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BlockPatch"
              },
              "example": {
                "check_out": "2026-12-05"
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Boekingen & Prijzen / Beschikbaarheid"
        ],
        "summary": "Handmatige blokkade verwijderen",
        "description": "Alleen deze handmatige blokkade verwijderen; nooit booking-/iCal-/OTA-bezetting.",
        "operationId": "deleteBlock",
        "responses": {
          "204": {
            "description": "Verwijderd; geen responsebody.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "block_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ]
      }
    },
    "/accommodations/{accommodation_id}/rates/": {
      "get": {
        "tags": [
          "Boekingen & Prijzen / Tarieven"
        ],
        "summary": "Effectieve nachtprijzen ophalen",
        "description": "Ontbrekende prijs is null. Houd nachtprijzen, restricties en vanafprijs gescheiden.",
        "operationId": "getRates",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rates"
                },
                "example": {
                  "accommodation_id": 123,
                  "currency": "EUR",
                  "from": "2026-11-01",
                  "to": "2026-11-02",
                  "days": [
                    {
                      "date": "2026-11-01",
                      "amount": "125.00",
                      "min_stay": 3,
                      "max_stay": null,
                      "arrival_allowed": true,
                      "departure_allowed": true,
                      "source": "season"
                    }
                  ],
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": true,
            "description": "Inclusief; lokale nacht in accommodatietijdzone.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "description": "Exclusief; maximaal 366 nachten na from.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          }
        ]
      },
      "patch": {
        "tags": [
          "Boekingen & Prijzen / Tarieven"
        ],
        "summary": "Nachtprijzen en restricties wijzigen",
        "description": "If-Match afkomstig van GET met dezelfde from/to-range. Alle days vallen binnen de range. De response bevat die volledige range. Atomaire update; kanaalsynchronisatie kan later volgen.\n\nNachtprijs-overrides splitsen bestaande periodes zonder overlap; pakketprijzen moeten eerst in het dashboard worden omgezet (409). Restricties maximaal 730 dagen.",
        "operationId": "updateRates",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Rates"
                },
                "example": {
                  "accommodation_id": 123,
                  "currency": "EUR",
                  "from": "2026-11-01",
                  "to": "2026-11-02",
                  "days": [
                    {
                      "date": "2026-11-01",
                      "amount": "125.00",
                      "min_stay": 3,
                      "max_stay": null,
                      "arrival_allowed": true,
                      "departure_allowed": true,
                      "source": "season"
                    }
                  ],
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "accommodation_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "name": "from",
            "in": "query",
            "required": true,
            "description": "Inclusief; lokale nacht in accommodatietijdzone.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          },
          {
            "name": "to",
            "in": "query",
            "required": true,
            "description": "Exclusief; maximaal 366 nachten na from.",
            "schema": {
              "type": "string",
              "format": "date",
              "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
              "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
              "minLength": 10,
              "maxLength": 10
            }
          },
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/RatesPatch"
              },
              "example": {
                "days": [
                  {
                    "date": "2026-11-01",
                    "amount": "140.00",
                    "min_stay": 3
                  }
                ]
              }
            }
          }
        }
      }
    },
    "/quotes/": {
      "post": {
        "tags": [
          "Boekingen & Prijzen / Tarieven"
        ],
        "summary": "Verblijfsprijs berekenen",
        "description": "Geen prijslock, betaling, e-mail of reservering. Prijs/boekbaarheid worden bij boeken opnieuw berekend. Onboekbare verblijven geven 200 met bookable=false; ongeldige invoer 400.",
        "operationId": "calculateQuote",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Quote"
                },
                "example": {
                  "accommodation_id": 123,
                  "bookable": false,
                  "reasons": [
                    "missing_rate"
                  ],
                  "currency": "EUR",
                  "rent": null,
                  "nights": [],
                  "extras": [],
                  "discounts": [],
                  "taxes": [],
                  "total": null,
                  "deposit": null,
                  "tax_inclusive": true,
                  "payment_schedule": []
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QuoteInput"
              },
              "example": {
                "accommodation_id": 123,
                "check_in": "2026-11-01",
                "check_out": "2026-11-08",
                "party": {
                  "adults": 2,
                  "kids": 0,
                  "babies": 0,
                  "pets": 0
                }
              }
            }
          }
        }
      }
    },
    "/guests/": {
      "get": {
        "tags": [
          "Gasten / Overzicht"
        ],
        "summary": "Gasten ophalen",
        "description": "Alleen gasten gekoppeld aan eigen boekingen; geen identiteitsdocumenten of accountoverschrijdende merges.",
        "operationId": "listGuests",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GuestPage"
                },
                "example": {
                  "results": [
                    {
                      "first_name": "Jamie",
                      "last_name": "Voorbeeld",
                      "email": "jamie@example.com",
                      "telephone": null,
                      "id": 92
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/guests/{guest_id}/": {
      "get": {
        "tags": [
          "Gasten / Overzicht"
        ],
        "summary": "Gast ophalen",
        "description": "",
        "operationId": "getGuest",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Guest"
                },
                "example": {
                  "first_name": "Jamie",
                  "last_name": "Voorbeeld",
                  "email": "jamie@example.com",
                  "telephone": null,
                  "id": 92
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "guest_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/threads/": {
      "get": {
        "tags": [
          "Inbox / Berichten"
        ],
        "summary": "Gesprekken ophalen",
        "description": "Gesprekken alleen lezen; berichten verzenden is buiten scope.",
        "operationId": "listThreads",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ThreadPage"
                },
                "example": {
                  "results": [
                    {
                      "id": 301,
                      "booking_id": 456,
                      "accommodation_id": 123,
                      "channel": "email",
                      "subject": "Vraag over aankomst",
                      "updated_at": "2026-09-29T10:00:00Z"
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          },
          {
            "name": "booking_id",
            "in": "query",
            "required": false,
            "description": "",
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/threads/{thread_id}/": {
      "get": {
        "tags": [
          "Inbox / Berichten"
        ],
        "summary": "Gesprek ophalen",
        "description": "",
        "operationId": "getThread",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Thread"
                },
                "example": {
                  "id": 301,
                  "booking_id": 456,
                  "accommodation_id": 123,
                  "channel": "email",
                  "subject": "Vraag over aankomst",
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "thread_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/threads/{thread_id}/messages/": {
      "get": {
        "tags": [
          "Inbox / Berichten"
        ],
        "summary": "Berichten ophalen",
        "description": "",
        "operationId": "listMessages",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MessagePage"
                },
                "example": {
                  "results": [
                    {
                      "id": 401,
                      "thread_id": 301,
                      "direction": "outbound",
                      "body": "Welkom vanaf 15:00 uur.",
                      "status": "queued",
                      "created_at": "2026-09-29T10:00:00Z"
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "thread_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          },
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/me/": {
      "get": {
        "tags": [
          "Profiel verhuurder / Profiel"
        ],
        "summary": "Eigen profiel ophalen",
        "description": "Profiel van de eigenaar van de API-key, inclusief verhuurdersbeschrijving. E-mailadres en profielfoto zijn alleen-lezen. Wijzig het e-mailadres via de geverifieerde accountprocedure in het dashboard.",
        "operationId": "getMe",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                },
                "example": {
                  "first_name": "Alex",
                  "last_name": "Voorbeeld",
                  "date_of_birth": null,
                  "gender": null,
                  "street": null,
                  "house_number": null,
                  "house_number_addition": null,
                  "postal_code": null,
                  "city": null,
                  "country": null,
                  "language": "nl",
                  "telephone": null,
                  "landlord_type": "private_person",
                  "company_name": null,
                  "kvk_number": null,
                  "vat_number": null,
                  "show_email": true,
                  "show_telephone": true,
                  "show_last_name": true,
                  "about_me": {
                    "nl": "Welkom bij onze villa."
                  },
                  "id": 42,
                  "email": "alex@example.com",
                  "profile_picture_url": null,
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        }
      },
      "patch": {
        "tags": [
          "Profiel verhuurder / Profiel"
        ],
        "summary": "Profiel wijzigen",
        "description": "Wijzig het profiel en de verhuurdersbeschrijving. date_of_birth is YYYY-MM-DD of null en mag niet in de toekomst liggen. first_name en last_name mogen niet leeg of null zijn. Landcode en taal moeten toegestaan zijn; about_me bevat vertalingen per toegestane taal. Alle wijzigingen worden samen opgeslagen. De ETag omvat het profiel en de verhuurdersbeschrijving.",
        "operationId": "updateMe",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              },
              "ETag": {
                "description": "Sterke versie van deze representatie.",
                "schema": {
                  "type": "string"
                },
                "example": "\"accommodation-123-v7\""
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Profile"
                },
                "example": {
                  "first_name": "Alex",
                  "last_name": "Voorbeeld",
                  "date_of_birth": null,
                  "gender": null,
                  "street": null,
                  "house_number": null,
                  "house_number_addition": null,
                  "postal_code": null,
                  "city": null,
                  "country": null,
                  "language": "nl",
                  "telephone": null,
                  "landlord_type": "private_person",
                  "company_name": null,
                  "kvk_number": null,
                  "vat_number": null,
                  "show_email": true,
                  "show_telephone": true,
                  "show_last_name": true,
                  "about_me": {
                    "nl": "Welkom bij onze villa."
                  },
                  "id": 42,
                  "email": "alex@example.com",
                  "profile_picture_url": null,
                  "updated_at": "2026-09-29T10:00:00Z"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "409": {
            "$ref": "#/components/responses/Conflict"
          },
          "412": {
            "$ref": "#/components/responses/PreconditionFailed"
          },
          "413": {
            "$ref": "#/components/responses/PayloadTooLarge"
          },
          "415": {
            "$ref": "#/components/responses/UnsupportedMediaType"
          },
          "428": {
            "$ref": "#/components/responses/PreconditionRequired"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/IfMatch"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ProfilePatch"
              },
              "example": {
                "first_name": "Alex",
                "telephone": "+31612345678",
                "about_me": {
                  "nl": "Welkom bij onze villa."
                }
              }
            }
          }
        }
      }
    },
    "/changes/": {
      "get": {
        "tags": [
          "Account / API Keys"
        ],
        "summary": "Wijzigingsfeed en startwatermark ophalen",
        "description": "Zonder cursor: lege results en huidig watermark. Lees daarna de volledige lijsten en vervolg de feed vanaf dit watermark. Bewaar de cursor ook bij lege results. Historie is 30 dagen beschikbaar; verlopen of ontbrekende historie geeft 410. Tombstones gelden uitsluitend voor eerder toegankelijke resources. Vergelijk periodiek met de volledige resources: niet alle achtergrondwijzigingen zijn gegarandeerd in de feed opgenomen.",
        "operationId": "listChanges",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Changes"
                },
                "example": {
                  "results": [
                    {
                      "cursor": "opaque-1042",
                      "resource_type": "booking",
                      "resource_id": 456,
                      "accommodation_id": 123,
                      "change_type": "updated",
                      "occurred_at": "2026-09-29T10:00:00Z"
                    }
                  ],
                  "next_cursor": "opaque-1042",
                  "has_more": false
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "410": {
            "$ref": "#/components/responses/Gone"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          }
        ]
      }
    },
    "/account/users/": {
      "get": {
        "tags": [
          "Gebruikers / Overzicht"
        ],
        "summary": "Subgebruikers ophalen",
        "description": "",
        "operationId": "listAccountUsers",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountUserPage"
                },
                "example": {
                  "results": [
                    {
                      "id": 43,
                      "first_name": "Sam",
                      "last_name": "Voorbeeld",
                      "email": "sam@example.com",
                      "active": true,
                      "user_active": true,
                      "accommodation_access": [
                        {
                          "accommodation_id": 123,
                          "permissions": {
                            "object": {
                              "general": "read"
                            }
                          }
                        }
                      ]
                    }
                  ],
                  "next": null,
                  "previous": null
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "$ref": "#/components/parameters/Cursor"
          },
          {
            "$ref": "#/components/parameters/PageSize"
          },
          {
            "name": "active",
            "in": "query",
            "required": false,
            "description": "Filter op actieve accountrelatie.",
            "schema": {
              "type": "boolean"
            }
          }
        ]
      }
    },
    "/account/users/{user_id}/": {
      "get": {
        "tags": [
          "Gebruikers / Overzicht"
        ],
        "summary": "Subgebruiker ophalen",
        "description": "Alleen de relatie/rechten binnen het account van de key.",
        "operationId": "getAccountUser",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AccountUser"
                },
                "example": {
                  "id": 43,
                  "first_name": "Sam",
                  "last_name": "Voorbeeld",
                  "email": "sam@example.com",
                  "active": true,
                  "user_active": true,
                  "accommodation_access": [
                    {
                      "accommodation_id": 123,
                      "permissions": {
                        "object": {
                          "general": "read"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "user_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    },
    "/bookings/{booking_id}/payments/": {
      "get": {
        "tags": [
          "Financieel / Transacties"
        ],
        "summary": "Betaaloverzicht ophalen",
        "description": "amount_due is de som van boekingsregels exclusief borg en verbruikskosten. deposit_due bevat de borg. amount_paid bevat positieve betalingstransacties vóór terugbetalingen; amount_refunded bevat negatieve transacties en geregistreerde borgterugbetalingen. payout_amount is null wanneer niet vastgesteld. Er worden geen kaart- of bankgegevens getoond.",
        "operationId": "getBookingPayments",
        "responses": {
          "200": {
            "description": "Geslaagd.",
            "headers": {
              "X-Request-ID": {
                "description": "Door Voyando gegenereerd request-ID.",
                "schema": {
                  "type": "string"
                }
              },
              "Cache-Control": {
                "schema": {
                  "type": "string",
                  "const": "no-store"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BookingPayments"
                },
                "example": {
                  "booking_id": 456,
                  "currency": "EUR",
                  "amount_due": "875.00",
                  "amount_paid": "400.00",
                  "amount_refunded": "0.00",
                  "deposit_due": "150.00",
                  "payout_amount": null,
                  "status": "partially_paid"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/TooManyRequests"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          }
        },
        "parameters": [
          {
            "name": "booking_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "integer",
              "minimum": 1
            }
          }
        ]
      }
    }
  },
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "Voyando opaque API key",
        "description": "Volledige toegang binnen eigen account; geen scopes of vervaldatum. Beheer via dashboard."
      }
    },
    "parameters": {
      "Cursor": {
        "name": "cursor",
        "in": "query",
        "description": "Ondoorzichtige cursor uit next/previous; accountgebonden.",
        "schema": {
          "type": "string"
        }
      },
      "PageSize": {
        "name": "page_size",
        "in": "query",
        "description": "Stabiele oplopende ID-volgorde; geen count.",
        "schema": {
          "type": "integer",
          "minimum": 1,
          "maximum": 100,
          "default": 25
        }
      },
      "IfMatch": {
        "name": "If-Match",
        "in": "header",
        "required": true,
        "description": "Sterke ETag van voorafgaande GET, inclusief quotes. Wildcard niet toegestaan.",
        "schema": {
          "type": "string"
        },
        "example": "\"accommodation-123-v7\""
      },
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": true,
        "description": "Unieke waarde per account/key/operatie. Zelfde payload herhaalt resultaat; andere payload 409. Het resultaat blijft 24 uur beschikbaar voor herhaling. Ontbrekend geeft 400.",
        "schema": {
          "type": "string",
          "minLength": 1,
          "maxLength": 255
        },
        "example": "81de84e7-30b4-42db-b657-bdb8f20869b4"
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Ongeldige JSON, velden, filters, cursor of datumrange.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "validation_error",
                "message": "Ongeldige JSON, velden, filters, cursor of datumrange.",
                "request_id": "req-example-001",
                "fields": {
                  "name": [
                    "This field may not be blank."
                  ]
                }
              }
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Geen geldige Bearer-key, ingetrokken key, verkeerde omgeving of inactieve eigenaar.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          },
          "WWW-Authenticate": {
            "schema": {
              "type": "string"
            },
            "example": "Bearer"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "unauthorized",
                "message": "Geen geldige Bearer-key, ingetrokken key, verkeerde omgeving of inactieve eigenaar.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "Forbidden": {
        "description": "Account heeft geen API-toelating. Geen per-key scopes.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "api_access_denied",
                "message": "Account heeft geen API-toelating. Geen per-key scopes.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "NotFound": {
        "description": "Niet bestaand of niet toegankelijk binnen dit account; dezelfde response.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "not_found",
                "message": "Niet bestaand of niet toegankelijk binnen dit account; dezelfde response.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "Methode niet ondersteund.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          },
          "Allow": {
            "description": "Werkelijk ondersteunde methoden van deze route.",
            "schema": {
              "type": "string"
            },
            "example": "GET, HEAD, OPTIONS"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "method_not_allowed",
                "message": "Methode niet ondersteund.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "Conflict": {
        "description": "Zakelijk conflict, bronbeperking of hergebruik van Idempotency-Key met andere payload.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "conflict",
                "message": "Zakelijk conflict, bronbeperking of hergebruik van Idempotency-Key met andere payload.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "Gone": {
        "description": "Cursor verlopen. Begin volledige resynchronisatie met nieuw watermark.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "cursor_expired",
                "message": "Cursor verlopen. Begin volledige resynchronisatie met nieuw watermark.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "PreconditionFailed": {
        "description": "If-Match is verouderd; herlees en beoordeel de wijziging.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "precondition_failed",
                "message": "If-Match is verouderd; herlees en beoordeel de wijziging.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "PayloadTooLarge": {
        "description": "JSON-body groter dan 64 KiB.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "payload_too_large",
                "message": "JSON-body groter dan 64 KiB.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "UnsupportedMediaType": {
        "description": "Alleen application/json voor requestbodies.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "unsupported_media_type",
                "message": "Alleen application/json voor requestbodies.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "PreconditionRequired": {
        "description": "Verplichte If-Match ontbreekt.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "precondition_required",
                "message": "Verplichte If-Match ontbreekt.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "TooManyRequests": {
        "description": "Limiet bereikt; geen mutatie uitgevoerd. Wacht minstens Retry-After seconden.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          },
          "Retry-After": {
            "description": "Minimale wachttijd in seconden.",
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "example": 10
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "rate_limited",
                "message": "Limiet bereikt; geen mutatie uitgevoerd. Wacht minstens Retry-After seconden.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "InternalError": {
        "description": "Onverwachte fout zonder interne details.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "internal_error",
                "message": "Onverwachte fout zonder interne details.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      },
      "Unavailable": {
        "description": "Tijdelijk niet beschikbaar, bijvoorbeeld bij uitval van de gedeelde limiter.",
        "headers": {
          "X-Request-ID": {
            "description": "Door Voyando gegenereerd request-ID.",
            "schema": {
              "type": "string"
            }
          },
          "Cache-Control": {
            "schema": {
              "type": "string",
              "const": "no-store"
            }
          },
          "Retry-After": {
            "description": "Minimale wachttijd in seconden.",
            "schema": {
              "type": "integer",
              "minimum": 1
            },
            "example": 10
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            },
            "example": {
              "error": {
                "code": "temporarily_unavailable",
                "message": "Tijdelijk niet beschikbaar, bijvoorbeeld bij uitval van de gedeelde limiter.",
                "request_id": "req-example-001"
              }
            }
          }
        }
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string"
              },
              "message": {
                "type": "string"
              },
              "fields": {
                "type": "object",
                "additionalProperties": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "request_id": {
                "type": "string"
              }
            },
            "required": [
              "code",
              "message",
              "request_id"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "error"
        ],
        "additionalProperties": false
      },
      "Profile": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 150
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 150
          },
          "date_of_birth": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "gender": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 10,
            "enum": [
              "",
              "male",
              "female",
              "other",
              null
            ]
          },
          "street": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "house_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "house_number_addition": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "postal_code": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 75,
            "enum": [
              "AF",
              "AX",
              "AL",
              "DZ",
              "AS",
              "AD",
              "AO",
              "AI",
              "AQ",
              "AG",
              "AR",
              "AM",
              "AW",
              "AU",
              "AT",
              "AZ",
              "BS",
              "BH",
              "BD",
              "BB",
              "BY",
              "BE",
              "BZ",
              "BJ",
              "BM",
              "BT",
              "BO",
              "BQ",
              "BA",
              "BW",
              "BV",
              "BR",
              "IO",
              "BN",
              "BG",
              "BF",
              "BI",
              "KH",
              "CM",
              "CA",
              "CV",
              "KY",
              "CF",
              "TD",
              "CL",
              "CN",
              "CX",
              "CC",
              "CO",
              "KM",
              "CG",
              "CD",
              "CK",
              "CR",
              "CI",
              "HR",
              "CU",
              "CW",
              "CY",
              "CZ",
              "DK",
              "DJ",
              "DM",
              "DO",
              "EC",
              "EG",
              "SV",
              "GQ",
              "ER",
              "EE",
              "ET",
              "FK",
              "FO",
              "FJ",
              "FI",
              "FR",
              "GF",
              "PF",
              "TF",
              "GA",
              "GM",
              "GE",
              "DE",
              "GH",
              "GI",
              "GR",
              "GL",
              "GD",
              "GP",
              "GU",
              "GT",
              "GG",
              "GN",
              "GW",
              "GY",
              "HT",
              "HM",
              "VA",
              "HN",
              "HK",
              "HU",
              "IS",
              "IN",
              "ID",
              "IR",
              "IQ",
              "IE",
              "IM",
              "IL",
              "IT",
              "JM",
              "JP",
              "JE",
              "JO",
              "KZ",
              "KE",
              "KI",
              "KP",
              "KR",
              "KW",
              "KG",
              "LA",
              "LV",
              "LB",
              "LS",
              "LR",
              "LY",
              "LI",
              "LT",
              "LU",
              "MO",
              "MK",
              "MG",
              "MW",
              "MY",
              "MV",
              "ML",
              "MT",
              "MH",
              "MQ",
              "MR",
              "MU",
              "YT",
              "MX",
              "FM",
              "MD",
              "MC",
              "MN",
              "ME",
              "MS",
              "MA",
              "MZ",
              "MM",
              "NA",
              "NR",
              "NP",
              "NL",
              "NC",
              "NZ",
              "NI",
              "NE",
              "NG",
              "NU",
              "NF",
              "MP",
              "NO",
              "OM",
              "PK",
              "PW",
              "PS",
              "PA",
              "PG",
              "PY",
              "PE",
              "PH",
              "PN",
              "PL",
              "PT",
              "PR",
              "QA",
              "RO",
              "RU",
              "RW",
              "BL",
              "SH",
              "KN",
              "LC",
              "MF",
              "PM",
              "VC",
              "WS",
              "SM",
              "ST",
              "SA",
              "SN",
              "RS",
              "SC",
              "SL",
              "SG",
              "SX",
              "SK",
              "SI",
              "SB",
              "SO",
              "ZA",
              "GS",
              "SS",
              "ES",
              "LK",
              "SD",
              "SR",
              "SJ",
              "SZ",
              "SE",
              "CH",
              "SY",
              "TW",
              "TJ",
              "TZ",
              "TH",
              "TL",
              "TG",
              "TK",
              "TO",
              "TT",
              "TN",
              "TR",
              "TM",
              "TC",
              "TV",
              "UG",
              "UA",
              "AE",
              "GB",
              "US",
              "UM",
              "UY",
              "UZ",
              "VU",
              "VE",
              "VN",
              "VG",
              "VI",
              "WF",
              "EH",
              "YE",
              "ZM",
              "ZW",
              null
            ]
          },
          "language": {
            "type": "string",
            "maxLength": 5,
            "enum": [
              "nl",
              "en",
              "de",
              "es",
              "fr",
              "it",
              "pt",
              "el",
              "hu"
            ]
          },
          "telephone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 150
          },
          "landlord_type": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 75,
            "enum": [
              "private_person",
              "corporate",
              null
            ]
          },
          "company_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 150
          },
          "kvk_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50
          },
          "vat_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50
          },
          "show_email": {
            "type": "boolean"
          },
          "show_telephone": {
            "type": "boolean"
          },
          "show_last_name": {
            "type": "boolean"
          },
          "about_me": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "email": {
            "type": "string",
            "maxLength": 254,
            "readOnly": true
          },
          "profile_picture_url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch."
          }
        },
        "required": [
          "id",
          "first_name",
          "last_name",
          "date_of_birth",
          "gender",
          "street",
          "house_number",
          "house_number_addition",
          "postal_code",
          "city",
          "country",
          "language",
          "telephone",
          "landlord_type",
          "company_name",
          "kvk_number",
          "vat_number",
          "show_email",
          "show_telephone",
          "show_last_name",
          "about_me",
          "email",
          "profile_picture_url",
          "updated_at"
        ],
        "additionalProperties": false,
        "description": "Profiel van de eigenaar van de API-key, inclusief verhuurdersbeschrijving. E-mailadres en profielfoto zijn alleen-lezen. Wijzig het e-mailadres via de geverifieerde accountprocedure in het dashboard.",
        "example": {
          "first_name": "Alex",
          "last_name": "Voorbeeld",
          "date_of_birth": null,
          "gender": null,
          "street": null,
          "house_number": null,
          "house_number_addition": null,
          "postal_code": null,
          "city": null,
          "country": null,
          "language": "nl",
          "telephone": null,
          "landlord_type": "private_person",
          "company_name": null,
          "kvk_number": null,
          "vat_number": null,
          "show_email": true,
          "show_telephone": true,
          "show_last_name": true,
          "about_me": {
            "nl": "Welkom bij onze villa."
          },
          "id": 42,
          "email": "alex@example.com",
          "profile_picture_url": null,
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "AccountUser": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "first_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 150
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 150
          },
          "email": {
            "type": "string",
            "maxLength": 254
          },
          "active": {
            "type": "boolean"
          },
          "user_active": {
            "type": "boolean"
          },
          "accommodation_access": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "accommodation_id": {
                  "type": "integer",
                  "minimum": 1
                },
                "permissions": {
                  "type": "object",
                  "description": "Bestaande dashboardrechten: domein (zoals house, bookings, inbox) → onderdeel → none/read/write; alleen rechten op accommodaties van dit account.",
                  "additionalProperties": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "string",
                      "enum": [
                        "none",
                        "read",
                        "write"
                      ]
                    }
                  }
                }
              },
              "required": [
                "accommodation_id",
                "permissions"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "id",
          "first_name",
          "last_name",
          "email",
          "active",
          "user_active",
          "accommodation_access"
        ],
        "additionalProperties": false,
        "example": {
          "id": 43,
          "first_name": "Sam",
          "last_name": "Voorbeeld",
          "email": "sam@example.com",
          "active": true,
          "user_active": true,
          "accommodation_access": [
            {
              "accommodation_id": 123,
              "permissions": {
                "object": {
                  "general": "read"
                }
              }
            }
          ]
        },
        "description": "active geldt voor de relatie met dit account; user_active voor de gebruiker. Geen andere parent-accounts zichtbaar. Rechten beschrijven de subgebruiker, niet de API-key."
      },
      "Accommodation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 40,
            "enum": [
              "home",
              "appartment",
              "logcabin",
              "treehouse",
              "b&b",
              "lodging",
              "bungalow",
              "groupaccommodation",
              "farm",
              "countryhouse",
              "boat",
              "villa",
              "chalet",
              "campingspot",
              "safaritent",
              "tinyhouse",
              "cabin",
              "glamping",
              "yurt",
              "gypsywagon",
              null
            ]
          },
          "timezone": {
            "type": "string",
            "maxLength": 32,
            "enum": [
              "Africa/Abidjan",
              "Africa/Accra",
              "Africa/Addis_Ababa",
              "Africa/Algiers",
              "Africa/Asmara",
              "Africa/Bamako",
              "Africa/Bangui",
              "Africa/Banjul",
              "Africa/Bissau",
              "Africa/Blantyre",
              "Africa/Brazzaville",
              "Africa/Bujumbura",
              "Africa/Cairo",
              "Africa/Casablanca",
              "Africa/Ceuta",
              "Africa/Conakry",
              "Africa/Dakar",
              "Africa/Dar_es_Salaam",
              "Africa/Djibouti",
              "Africa/Douala",
              "Africa/El_Aaiun",
              "Africa/Freetown",
              "Africa/Gaborone",
              "Africa/Harare",
              "Africa/Johannesburg",
              "Africa/Juba",
              "Africa/Kampala",
              "Africa/Khartoum",
              "Africa/Kigali",
              "Africa/Kinshasa",
              "Africa/Lagos",
              "Africa/Libreville",
              "Africa/Lome",
              "Africa/Luanda",
              "Africa/Lubumbashi",
              "Africa/Lusaka",
              "Africa/Malabo",
              "Africa/Maputo",
              "Africa/Maseru",
              "Africa/Mbabane",
              "Africa/Mogadishu",
              "Africa/Monrovia",
              "Africa/Nairobi",
              "Africa/Ndjamena",
              "Africa/Niamey",
              "Africa/Nouakchott",
              "Africa/Ouagadougou",
              "Africa/Porto-Novo",
              "Africa/Sao_Tome",
              "Africa/Tripoli",
              "Africa/Tunis",
              "Africa/Windhoek",
              "America/Adak",
              "America/Anchorage",
              "America/Anguilla",
              "America/Antigua",
              "America/Araguaina",
              "America/Argentina/Buenos_Aires",
              "America/Argentina/Catamarca",
              "America/Argentina/Cordoba",
              "America/Argentina/Jujuy",
              "America/Argentina/La_Rioja",
              "America/Argentina/Mendoza",
              "America/Argentina/Rio_Gallegos",
              "America/Argentina/Salta",
              "America/Argentina/San_Juan",
              "America/Argentina/San_Luis",
              "America/Argentina/Tucuman",
              "America/Argentina/Ushuaia",
              "America/Aruba",
              "America/Asuncion",
              "America/Atikokan",
              "America/Bahia",
              "America/Bahia_Banderas",
              "America/Barbados",
              "America/Belem",
              "America/Belize",
              "America/Blanc-Sablon",
              "America/Boa_Vista",
              "America/Bogota",
              "America/Boise",
              "America/Cambridge_Bay",
              "America/Campo_Grande",
              "America/Cancun",
              "America/Caracas",
              "America/Cayenne",
              "America/Cayman",
              "America/Chicago",
              "America/Chihuahua",
              "America/Costa_Rica",
              "America/Creston",
              "America/Cuiaba",
              "America/Curacao",
              "America/Danmarkshavn",
              "America/Dawson",
              "America/Dawson_Creek",
              "America/Denver",
              "America/Detroit",
              "America/Dominica",
              "America/Edmonton",
              "America/Eirunepe",
              "America/El_Salvador",
              "America/Fort_Nelson",
              "America/Fortaleza",
              "America/Glace_Bay",
              "America/Goose_Bay",
              "America/Grand_Turk",
              "America/Grenada",
              "America/Guadeloupe",
              "America/Guatemala",
              "America/Guayaquil",
              "America/Guyana",
              "America/Halifax",
              "America/Havana",
              "America/Hermosillo",
              "America/Indiana/Indianapolis",
              "America/Indiana/Knox",
              "America/Indiana/Marengo",
              "America/Indiana/Petersburg",
              "America/Indiana/Tell_City",
              "America/Indiana/Vevay",
              "America/Indiana/Vincennes",
              "America/Indiana/Winamac",
              "America/Inuvik",
              "America/Iqaluit",
              "America/Jamaica",
              "America/Juneau",
              "America/Kentucky/Louisville",
              "America/Kentucky/Monticello",
              "America/Kralendijk",
              "America/La_Paz",
              "America/Lima",
              "America/Los_Angeles",
              "America/Lower_Princes",
              "America/Maceio",
              "America/Managua",
              "America/Manaus",
              "America/Marigot",
              "America/Martinique",
              "America/Matamoros",
              "America/Mazatlan",
              "America/Menominee",
              "America/Merida",
              "America/Metlakatla",
              "America/Mexico_City",
              "America/Miquelon",
              "America/Moncton",
              "America/Monterrey",
              "America/Montevideo",
              "America/Montserrat",
              "America/Nassau",
              "America/New_York",
              "America/Nipigon",
              "America/Nome",
              "America/Noronha",
              "America/North_Dakota/Beulah",
              "America/North_Dakota/Center",
              "America/North_Dakota/New_Salem",
              "America/Nuuk",
              "America/Ojinaga",
              "America/Panama",
              "America/Pangnirtung",
              "America/Paramaribo",
              "America/Phoenix",
              "America/Port-au-Prince",
              "America/Port_of_Spain",
              "America/Porto_Velho",
              "America/Puerto_Rico",
              "America/Punta_Arenas",
              "America/Rainy_River",
              "America/Rankin_Inlet",
              "America/Recife",
              "America/Regina",
              "America/Resolute",
              "America/Rio_Branco",
              "America/Santarem",
              "America/Santiago",
              "America/Santo_Domingo",
              "America/Sao_Paulo",
              "America/Scoresbysund",
              "America/Sitka",
              "America/St_Barthelemy",
              "America/St_Johns",
              "America/St_Kitts",
              "America/St_Lucia",
              "America/St_Thomas",
              "America/St_Vincent",
              "America/Swift_Current",
              "America/Tegucigalpa",
              "America/Thule",
              "America/Thunder_Bay",
              "America/Tijuana",
              "America/Toronto",
              "America/Tortola",
              "America/Vancouver",
              "America/Whitehorse",
              "America/Winnipeg",
              "America/Yakutat",
              "America/Yellowknife",
              "Antarctica/Casey",
              "Antarctica/Davis",
              "Antarctica/DumontDUrville",
              "Antarctica/Macquarie",
              "Antarctica/Mawson",
              "Antarctica/McMurdo",
              "Antarctica/Palmer",
              "Antarctica/Rothera",
              "Antarctica/Syowa",
              "Antarctica/Troll",
              "Antarctica/Vostok",
              "Arctic/Longyearbyen",
              "Asia/Aden",
              "Asia/Almaty",
              "Asia/Amman",
              "Asia/Anadyr",
              "Asia/Aqtau",
              "Asia/Aqtobe",
              "Asia/Ashgabat",
              "Asia/Atyrau",
              "Asia/Baghdad",
              "Asia/Bahrain",
              "Asia/Baku",
              "Asia/Bangkok",
              "Asia/Barnaul",
              "Asia/Beirut",
              "Asia/Bishkek",
              "Asia/Brunei",
              "Asia/Chita",
              "Asia/Choibalsan",
              "Asia/Colombo",
              "Asia/Damascus",
              "Asia/Dhaka",
              "Asia/Dili",
              "Asia/Dubai",
              "Asia/Dushanbe",
              "Asia/Famagusta",
              "Asia/Gaza",
              "Asia/Hebron",
              "Asia/Ho_Chi_Minh",
              "Asia/Hong_Kong",
              "Asia/Hovd",
              "Asia/Irkutsk",
              "Asia/Jakarta",
              "Asia/Jayapura",
              "Asia/Jerusalem",
              "Asia/Kabul",
              "Asia/Kamchatka",
              "Asia/Karachi",
              "Asia/Kathmandu",
              "Asia/Khandyga",
              "Asia/Kolkata",
              "Asia/Krasnoyarsk",
              "Asia/Kuala_Lumpur",
              "Asia/Kuching",
              "Asia/Kuwait",
              "Asia/Macau",
              "Asia/Magadan",
              "Asia/Makassar",
              "Asia/Manila",
              "Asia/Muscat",
              "Asia/Nicosia",
              "Asia/Novokuznetsk",
              "Asia/Novosibirsk",
              "Asia/Omsk",
              "Asia/Oral",
              "Asia/Phnom_Penh",
              "Asia/Pontianak",
              "Asia/Pyongyang",
              "Asia/Qatar",
              "Asia/Qostanay",
              "Asia/Qyzylorda",
              "Asia/Riyadh",
              "Asia/Sakhalin",
              "Asia/Samarkand",
              "Asia/Seoul",
              "Asia/Shanghai",
              "Asia/Singapore",
              "Asia/Srednekolymsk",
              "Asia/Taipei",
              "Asia/Tashkent",
              "Asia/Tbilisi",
              "Asia/Tehran",
              "Asia/Thimphu",
              "Asia/Tokyo",
              "Asia/Tomsk",
              "Asia/Ulaanbaatar",
              "Asia/Urumqi",
              "Asia/Ust-Nera",
              "Asia/Vientiane",
              "Asia/Vladivostok",
              "Asia/Yakutsk",
              "Asia/Yangon",
              "Asia/Yekaterinburg",
              "Asia/Yerevan",
              "Atlantic/Azores",
              "Atlantic/Bermuda",
              "Atlantic/Canary",
              "Atlantic/Cape_Verde",
              "Atlantic/Faroe",
              "Atlantic/Madeira",
              "Atlantic/Reykjavik",
              "Atlantic/South_Georgia",
              "Atlantic/St_Helena",
              "Atlantic/Stanley",
              "Australia/Adelaide",
              "Australia/Brisbane",
              "Australia/Broken_Hill",
              "Australia/Darwin",
              "Australia/Eucla",
              "Australia/Hobart",
              "Australia/Lindeman",
              "Australia/Lord_Howe",
              "Australia/Melbourne",
              "Australia/Perth",
              "Australia/Sydney",
              "Canada/Atlantic",
              "Canada/Central",
              "Canada/Eastern",
              "Canada/Mountain",
              "Canada/Newfoundland",
              "Canada/Pacific",
              "Europe/Amsterdam",
              "Europe/Andorra",
              "Europe/Astrakhan",
              "Europe/Athens",
              "Europe/Belgrade",
              "Europe/Berlin",
              "Europe/Bratislava",
              "Europe/Brussels",
              "Europe/Bucharest",
              "Europe/Budapest",
              "Europe/Busingen",
              "Europe/Chisinau",
              "Europe/Copenhagen",
              "Europe/Dublin",
              "Europe/Gibraltar",
              "Europe/Guernsey",
              "Europe/Helsinki",
              "Europe/Isle_of_Man",
              "Europe/Istanbul",
              "Europe/Jersey",
              "Europe/Kaliningrad",
              "Europe/Kiev",
              "Europe/Kirov",
              "Europe/Lisbon",
              "Europe/Ljubljana",
              "Europe/London",
              "Europe/Luxembourg",
              "Europe/Madrid",
              "Europe/Malta",
              "Europe/Mariehamn",
              "Europe/Minsk",
              "Europe/Monaco",
              "Europe/Moscow",
              "Europe/Oslo",
              "Europe/Paris",
              "Europe/Podgorica",
              "Europe/Prague",
              "Europe/Riga",
              "Europe/Rome",
              "Europe/Samara",
              "Europe/San_Marino",
              "Europe/Sarajevo",
              "Europe/Saratov",
              "Europe/Simferopol",
              "Europe/Skopje",
              "Europe/Sofia",
              "Europe/Stockholm",
              "Europe/Tallinn",
              "Europe/Tirane",
              "Europe/Ulyanovsk",
              "Europe/Uzhgorod",
              "Europe/Vaduz",
              "Europe/Vatican",
              "Europe/Vienna",
              "Europe/Vilnius",
              "Europe/Volgograd",
              "Europe/Warsaw",
              "Europe/Zagreb",
              "Europe/Zaporozhye",
              "Europe/Zurich",
              "GMT",
              "Indian/Antananarivo",
              "Indian/Chagos",
              "Indian/Christmas",
              "Indian/Cocos",
              "Indian/Comoro",
              "Indian/Kerguelen",
              "Indian/Mahe",
              "Indian/Maldives",
              "Indian/Mauritius",
              "Indian/Mayotte",
              "Indian/Reunion",
              "Pacific/Apia",
              "Pacific/Auckland",
              "Pacific/Bougainville",
              "Pacific/Chatham",
              "Pacific/Chuuk",
              "Pacific/Easter",
              "Pacific/Efate",
              "Pacific/Enderbury",
              "Pacific/Fakaofo",
              "Pacific/Fiji",
              "Pacific/Funafuti",
              "Pacific/Galapagos",
              "Pacific/Gambier",
              "Pacific/Guadalcanal",
              "Pacific/Guam",
              "Pacific/Honolulu",
              "Pacific/Kiritimati",
              "Pacific/Kosrae",
              "Pacific/Kwajalein",
              "Pacific/Majuro",
              "Pacific/Marquesas",
              "Pacific/Midway",
              "Pacific/Nauru",
              "Pacific/Niue",
              "Pacific/Norfolk",
              "Pacific/Noumea",
              "Pacific/Pago_Pago",
              "Pacific/Palau",
              "Pacific/Pitcairn",
              "Pacific/Pohnpei",
              "Pacific/Port_Moresby",
              "Pacific/Rarotonga",
              "Pacific/Saipan",
              "Pacific/Tahiti",
              "Pacific/Tarawa",
              "Pacific/Tongatapu",
              "Pacific/Wake",
              "Pacific/Wallis",
              "US/Alaska",
              "US/Arizona",
              "US/Central",
              "US/Eastern",
              "US/Hawaii",
              "US/Mountain",
              "US/Pacific",
              "UTC"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 10,
            "enum": [
              "EUR",
              "USD",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "NZD",
              "SEK",
              "DKK",
              "NOK",
              "KRW",
              "TRY",
              "RUB",
              "MXN",
              "CNY",
              "INR",
              "BRL",
              "ZAR",
              "HKD",
              "IDR",
              "MYR",
              "PHP",
              "SGD",
              "THB",
              "VND",
              "PLN",
              "CZK",
              "HUF",
              "ILS",
              "TWD",
              null
            ]
          }
        },
        "required": [
          "id",
          "updated_at",
          "name",
          "type",
          "timezone",
          "currency"
        ],
        "additionalProperties": false,
        "example": {
          "id": 123,
          "name": "Villa Voorbeeld",
          "type": "villa",
          "timezone": "Europe/Amsterdam",
          "currency": "EUR",
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "AccommodationGeneral": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 40,
            "enum": [
              "home",
              "appartment",
              "logcabin",
              "treehouse",
              "b&b",
              "lodging",
              "bungalow",
              "groupaccommodation",
              "farm",
              "countryhouse",
              "boat",
              "villa",
              "chalet",
              "campingspot",
              "safaritent",
              "tinyhouse",
              "cabin",
              "glamping",
              "yurt",
              "gypsywagon",
              null
            ]
          },
          "timezone": {
            "type": "string",
            "maxLength": 32,
            "enum": [
              "Africa/Abidjan",
              "Africa/Accra",
              "Africa/Addis_Ababa",
              "Africa/Algiers",
              "Africa/Asmara",
              "Africa/Bamako",
              "Africa/Bangui",
              "Africa/Banjul",
              "Africa/Bissau",
              "Africa/Blantyre",
              "Africa/Brazzaville",
              "Africa/Bujumbura",
              "Africa/Cairo",
              "Africa/Casablanca",
              "Africa/Ceuta",
              "Africa/Conakry",
              "Africa/Dakar",
              "Africa/Dar_es_Salaam",
              "Africa/Djibouti",
              "Africa/Douala",
              "Africa/El_Aaiun",
              "Africa/Freetown",
              "Africa/Gaborone",
              "Africa/Harare",
              "Africa/Johannesburg",
              "Africa/Juba",
              "Africa/Kampala",
              "Africa/Khartoum",
              "Africa/Kigali",
              "Africa/Kinshasa",
              "Africa/Lagos",
              "Africa/Libreville",
              "Africa/Lome",
              "Africa/Luanda",
              "Africa/Lubumbashi",
              "Africa/Lusaka",
              "Africa/Malabo",
              "Africa/Maputo",
              "Africa/Maseru",
              "Africa/Mbabane",
              "Africa/Mogadishu",
              "Africa/Monrovia",
              "Africa/Nairobi",
              "Africa/Ndjamena",
              "Africa/Niamey",
              "Africa/Nouakchott",
              "Africa/Ouagadougou",
              "Africa/Porto-Novo",
              "Africa/Sao_Tome",
              "Africa/Tripoli",
              "Africa/Tunis",
              "Africa/Windhoek",
              "America/Adak",
              "America/Anchorage",
              "America/Anguilla",
              "America/Antigua",
              "America/Araguaina",
              "America/Argentina/Buenos_Aires",
              "America/Argentina/Catamarca",
              "America/Argentina/Cordoba",
              "America/Argentina/Jujuy",
              "America/Argentina/La_Rioja",
              "America/Argentina/Mendoza",
              "America/Argentina/Rio_Gallegos",
              "America/Argentina/Salta",
              "America/Argentina/San_Juan",
              "America/Argentina/San_Luis",
              "America/Argentina/Tucuman",
              "America/Argentina/Ushuaia",
              "America/Aruba",
              "America/Asuncion",
              "America/Atikokan",
              "America/Bahia",
              "America/Bahia_Banderas",
              "America/Barbados",
              "America/Belem",
              "America/Belize",
              "America/Blanc-Sablon",
              "America/Boa_Vista",
              "America/Bogota",
              "America/Boise",
              "America/Cambridge_Bay",
              "America/Campo_Grande",
              "America/Cancun",
              "America/Caracas",
              "America/Cayenne",
              "America/Cayman",
              "America/Chicago",
              "America/Chihuahua",
              "America/Costa_Rica",
              "America/Creston",
              "America/Cuiaba",
              "America/Curacao",
              "America/Danmarkshavn",
              "America/Dawson",
              "America/Dawson_Creek",
              "America/Denver",
              "America/Detroit",
              "America/Dominica",
              "America/Edmonton",
              "America/Eirunepe",
              "America/El_Salvador",
              "America/Fort_Nelson",
              "America/Fortaleza",
              "America/Glace_Bay",
              "America/Goose_Bay",
              "America/Grand_Turk",
              "America/Grenada",
              "America/Guadeloupe",
              "America/Guatemala",
              "America/Guayaquil",
              "America/Guyana",
              "America/Halifax",
              "America/Havana",
              "America/Hermosillo",
              "America/Indiana/Indianapolis",
              "America/Indiana/Knox",
              "America/Indiana/Marengo",
              "America/Indiana/Petersburg",
              "America/Indiana/Tell_City",
              "America/Indiana/Vevay",
              "America/Indiana/Vincennes",
              "America/Indiana/Winamac",
              "America/Inuvik",
              "America/Iqaluit",
              "America/Jamaica",
              "America/Juneau",
              "America/Kentucky/Louisville",
              "America/Kentucky/Monticello",
              "America/Kralendijk",
              "America/La_Paz",
              "America/Lima",
              "America/Los_Angeles",
              "America/Lower_Princes",
              "America/Maceio",
              "America/Managua",
              "America/Manaus",
              "America/Marigot",
              "America/Martinique",
              "America/Matamoros",
              "America/Mazatlan",
              "America/Menominee",
              "America/Merida",
              "America/Metlakatla",
              "America/Mexico_City",
              "America/Miquelon",
              "America/Moncton",
              "America/Monterrey",
              "America/Montevideo",
              "America/Montserrat",
              "America/Nassau",
              "America/New_York",
              "America/Nipigon",
              "America/Nome",
              "America/Noronha",
              "America/North_Dakota/Beulah",
              "America/North_Dakota/Center",
              "America/North_Dakota/New_Salem",
              "America/Nuuk",
              "America/Ojinaga",
              "America/Panama",
              "America/Pangnirtung",
              "America/Paramaribo",
              "America/Phoenix",
              "America/Port-au-Prince",
              "America/Port_of_Spain",
              "America/Porto_Velho",
              "America/Puerto_Rico",
              "America/Punta_Arenas",
              "America/Rainy_River",
              "America/Rankin_Inlet",
              "America/Recife",
              "America/Regina",
              "America/Resolute",
              "America/Rio_Branco",
              "America/Santarem",
              "America/Santiago",
              "America/Santo_Domingo",
              "America/Sao_Paulo",
              "America/Scoresbysund",
              "America/Sitka",
              "America/St_Barthelemy",
              "America/St_Johns",
              "America/St_Kitts",
              "America/St_Lucia",
              "America/St_Thomas",
              "America/St_Vincent",
              "America/Swift_Current",
              "America/Tegucigalpa",
              "America/Thule",
              "America/Thunder_Bay",
              "America/Tijuana",
              "America/Toronto",
              "America/Tortola",
              "America/Vancouver",
              "America/Whitehorse",
              "America/Winnipeg",
              "America/Yakutat",
              "America/Yellowknife",
              "Antarctica/Casey",
              "Antarctica/Davis",
              "Antarctica/DumontDUrville",
              "Antarctica/Macquarie",
              "Antarctica/Mawson",
              "Antarctica/McMurdo",
              "Antarctica/Palmer",
              "Antarctica/Rothera",
              "Antarctica/Syowa",
              "Antarctica/Troll",
              "Antarctica/Vostok",
              "Arctic/Longyearbyen",
              "Asia/Aden",
              "Asia/Almaty",
              "Asia/Amman",
              "Asia/Anadyr",
              "Asia/Aqtau",
              "Asia/Aqtobe",
              "Asia/Ashgabat",
              "Asia/Atyrau",
              "Asia/Baghdad",
              "Asia/Bahrain",
              "Asia/Baku",
              "Asia/Bangkok",
              "Asia/Barnaul",
              "Asia/Beirut",
              "Asia/Bishkek",
              "Asia/Brunei",
              "Asia/Chita",
              "Asia/Choibalsan",
              "Asia/Colombo",
              "Asia/Damascus",
              "Asia/Dhaka",
              "Asia/Dili",
              "Asia/Dubai",
              "Asia/Dushanbe",
              "Asia/Famagusta",
              "Asia/Gaza",
              "Asia/Hebron",
              "Asia/Ho_Chi_Minh",
              "Asia/Hong_Kong",
              "Asia/Hovd",
              "Asia/Irkutsk",
              "Asia/Jakarta",
              "Asia/Jayapura",
              "Asia/Jerusalem",
              "Asia/Kabul",
              "Asia/Kamchatka",
              "Asia/Karachi",
              "Asia/Kathmandu",
              "Asia/Khandyga",
              "Asia/Kolkata",
              "Asia/Krasnoyarsk",
              "Asia/Kuala_Lumpur",
              "Asia/Kuching",
              "Asia/Kuwait",
              "Asia/Macau",
              "Asia/Magadan",
              "Asia/Makassar",
              "Asia/Manila",
              "Asia/Muscat",
              "Asia/Nicosia",
              "Asia/Novokuznetsk",
              "Asia/Novosibirsk",
              "Asia/Omsk",
              "Asia/Oral",
              "Asia/Phnom_Penh",
              "Asia/Pontianak",
              "Asia/Pyongyang",
              "Asia/Qatar",
              "Asia/Qostanay",
              "Asia/Qyzylorda",
              "Asia/Riyadh",
              "Asia/Sakhalin",
              "Asia/Samarkand",
              "Asia/Seoul",
              "Asia/Shanghai",
              "Asia/Singapore",
              "Asia/Srednekolymsk",
              "Asia/Taipei",
              "Asia/Tashkent",
              "Asia/Tbilisi",
              "Asia/Tehran",
              "Asia/Thimphu",
              "Asia/Tokyo",
              "Asia/Tomsk",
              "Asia/Ulaanbaatar",
              "Asia/Urumqi",
              "Asia/Ust-Nera",
              "Asia/Vientiane",
              "Asia/Vladivostok",
              "Asia/Yakutsk",
              "Asia/Yangon",
              "Asia/Yekaterinburg",
              "Asia/Yerevan",
              "Atlantic/Azores",
              "Atlantic/Bermuda",
              "Atlantic/Canary",
              "Atlantic/Cape_Verde",
              "Atlantic/Faroe",
              "Atlantic/Madeira",
              "Atlantic/Reykjavik",
              "Atlantic/South_Georgia",
              "Atlantic/St_Helena",
              "Atlantic/Stanley",
              "Australia/Adelaide",
              "Australia/Brisbane",
              "Australia/Broken_Hill",
              "Australia/Darwin",
              "Australia/Eucla",
              "Australia/Hobart",
              "Australia/Lindeman",
              "Australia/Lord_Howe",
              "Australia/Melbourne",
              "Australia/Perth",
              "Australia/Sydney",
              "Canada/Atlantic",
              "Canada/Central",
              "Canada/Eastern",
              "Canada/Mountain",
              "Canada/Newfoundland",
              "Canada/Pacific",
              "Europe/Amsterdam",
              "Europe/Andorra",
              "Europe/Astrakhan",
              "Europe/Athens",
              "Europe/Belgrade",
              "Europe/Berlin",
              "Europe/Bratislava",
              "Europe/Brussels",
              "Europe/Bucharest",
              "Europe/Budapest",
              "Europe/Busingen",
              "Europe/Chisinau",
              "Europe/Copenhagen",
              "Europe/Dublin",
              "Europe/Gibraltar",
              "Europe/Guernsey",
              "Europe/Helsinki",
              "Europe/Isle_of_Man",
              "Europe/Istanbul",
              "Europe/Jersey",
              "Europe/Kaliningrad",
              "Europe/Kiev",
              "Europe/Kirov",
              "Europe/Lisbon",
              "Europe/Ljubljana",
              "Europe/London",
              "Europe/Luxembourg",
              "Europe/Madrid",
              "Europe/Malta",
              "Europe/Mariehamn",
              "Europe/Minsk",
              "Europe/Monaco",
              "Europe/Moscow",
              "Europe/Oslo",
              "Europe/Paris",
              "Europe/Podgorica",
              "Europe/Prague",
              "Europe/Riga",
              "Europe/Rome",
              "Europe/Samara",
              "Europe/San_Marino",
              "Europe/Sarajevo",
              "Europe/Saratov",
              "Europe/Simferopol",
              "Europe/Skopje",
              "Europe/Sofia",
              "Europe/Stockholm",
              "Europe/Tallinn",
              "Europe/Tirane",
              "Europe/Ulyanovsk",
              "Europe/Uzhgorod",
              "Europe/Vaduz",
              "Europe/Vatican",
              "Europe/Vienna",
              "Europe/Vilnius",
              "Europe/Volgograd",
              "Europe/Warsaw",
              "Europe/Zagreb",
              "Europe/Zaporozhye",
              "Europe/Zurich",
              "GMT",
              "Indian/Antananarivo",
              "Indian/Chagos",
              "Indian/Christmas",
              "Indian/Cocos",
              "Indian/Comoro",
              "Indian/Kerguelen",
              "Indian/Mahe",
              "Indian/Maldives",
              "Indian/Mauritius",
              "Indian/Mayotte",
              "Indian/Reunion",
              "Pacific/Apia",
              "Pacific/Auckland",
              "Pacific/Bougainville",
              "Pacific/Chatham",
              "Pacific/Chuuk",
              "Pacific/Easter",
              "Pacific/Efate",
              "Pacific/Enderbury",
              "Pacific/Fakaofo",
              "Pacific/Fiji",
              "Pacific/Funafuti",
              "Pacific/Galapagos",
              "Pacific/Gambier",
              "Pacific/Guadalcanal",
              "Pacific/Guam",
              "Pacific/Honolulu",
              "Pacific/Kiritimati",
              "Pacific/Kosrae",
              "Pacific/Kwajalein",
              "Pacific/Majuro",
              "Pacific/Marquesas",
              "Pacific/Midway",
              "Pacific/Nauru",
              "Pacific/Niue",
              "Pacific/Norfolk",
              "Pacific/Noumea",
              "Pacific/Pago_Pago",
              "Pacific/Palau",
              "Pacific/Pitcairn",
              "Pacific/Pohnpei",
              "Pacific/Port_Moresby",
              "Pacific/Rarotonga",
              "Pacific/Saipan",
              "Pacific/Tahiti",
              "Pacific/Tarawa",
              "Pacific/Tongatapu",
              "Pacific/Wake",
              "Pacific/Wallis",
              "US/Alaska",
              "US/Arizona",
              "US/Central",
              "US/Eastern",
              "US/Hawaii",
              "US/Mountain",
              "US/Pacific",
              "UTC"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 10,
            "enum": [
              "EUR",
              "USD",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "NZD",
              "SEK",
              "DKK",
              "NOK",
              "KRW",
              "TRY",
              "RUB",
              "MXN",
              "CNY",
              "INR",
              "BRL",
              "ZAR",
              "HKD",
              "IDR",
              "MYR",
              "PHP",
              "SGD",
              "THB",
              "VND",
              "PLN",
              "CZK",
              "HUF",
              "ILS",
              "TWD",
              null
            ]
          },
          "title": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 100
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "subtitle": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 255
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "minItems": 1,
            "uniqueItems": true,
            "description": "Language.code; alle codes moeten in Language bestaan en toegestaan zijn voor de accommodatie."
          },
          "default_language": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "nl",
              "en",
              "de",
              "es",
              "fr",
              "it",
              "pt",
              "el",
              "hu",
              null
            ]
          },
          "starting_price": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^-?(0|[1-9][0-9]{0,7})\\.[0-9]{2}$(?![\\s\\S])",
            "description": "Decimale string met exact 2 decimalen en maximaal 8 cijfers vóór de punt. Geen exponent, komma of JSON-getal."
          },
          "default_vat": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^-?(0|[1-9][0-9]{0,1})\\.[0-9]{1}$(?![\\s\\S])",
            "description": "Decimale string met exact 1 decimalen en maximaal 2 cijfers vóór de punt. Geen exponent, komma of JSON-getal."
          },
          "max_persons": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 2147483647
          },
          "max_babies": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "max_pets": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "baby_max_age": {
            "type": "integer",
            "minimum": 0,
            "maximum": 17
          },
          "child_max_age": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25
          },
          "checkin_start": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$(?![\\s\\S])",
            "description": "Exact HH:MM:SS (00:00:00–23:59:59), lokale accommodatietijd. Geen datum, tijdzone, fracties of HH:MM.",
            "minLength": 8,
            "maxLength": 8
          },
          "checkin_end": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$(?![\\s\\S])",
            "description": "Exact HH:MM:SS (00:00:00–23:59:59), lokale accommodatietijd. Geen datum, tijdzone, fracties of HH:MM.",
            "minLength": 8,
            "maxLength": 8
          },
          "checkout_start": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$(?![\\s\\S])",
            "description": "Exact HH:MM:SS (00:00:00–23:59:59), lokale accommodatietijd. Geen datum, tijdzone, fracties of HH:MM.",
            "minLength": 8,
            "maxLength": 8
          },
          "checkout_end": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$(?![\\s\\S])",
            "description": "Exact HH:MM:SS (00:00:00–23:59:59), lokale accommodatietijd. Geen datum, tijdzone, fracties of HH:MM.",
            "minLength": 8,
            "maxLength": 8
          },
          "show_checkin_times": {
            "type": "boolean"
          },
          "smoking": {
            "type": "boolean"
          },
          "parties_events": {
            "type": "boolean"
          },
          "auto_approve_bookings": {
            "type": "boolean"
          },
          "max_booking_days_ahead": {
            "type": "integer",
            "minimum": 1,
            "maximum": 730
          }
        },
        "required": [
          "id",
          "updated_at",
          "name",
          "type",
          "timezone",
          "currency",
          "title",
          "subtitle",
          "languages",
          "default_language",
          "starting_price",
          "default_vat",
          "max_persons",
          "max_babies",
          "max_pets",
          "baby_max_age",
          "child_max_age",
          "checkin_start",
          "checkin_end",
          "checkout_start",
          "checkout_end",
          "show_checkin_times",
          "smoking",
          "parties_events",
          "auto_approve_bookings",
          "max_booking_days_ahead"
        ],
        "additionalProperties": false,
        "example": {
          "id": 123,
          "name": "Villa Voorbeeld",
          "type": "villa",
          "timezone": "Europe/Amsterdam",
          "currency": "EUR",
          "updated_at": "2026-09-29T10:00:00Z",
          "title": {
            "nl": "Villa aan het water",
            "en": "Lakeside villa"
          },
          "subtitle": {
            "nl": "Rust en ruimte"
          },
          "languages": [
            "nl",
            "en"
          ],
          "default_language": "nl",
          "starting_price": "125.00",
          "default_vat": "9.0",
          "max_persons": 6,
          "max_babies": 1,
          "max_pets": 0,
          "baby_max_age": 2,
          "child_max_age": 17,
          "checkin_start": "15:00:00",
          "checkin_end": null,
          "checkout_start": null,
          "checkout_end": "10:00:00",
          "show_checkin_times": true,
          "smoking": false,
          "parties_events": false,
          "auto_approve_bookings": false,
          "max_booking_days_ahead": 730
        },
        "description": "name is de onvertaalde huisnaam. title/subtitle zijn taalobjecten. Vanafprijs is geen nachtprijskalender. Valuta/btw-wijzigingen herberekenen historische boekingen niet."
      },
      "AccommodationGeneralPatch": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1
          },
          "type": {
            "type": "string",
            "maxLength": 40,
            "minLength": 1,
            "enum": [
              "home",
              "appartment",
              "logcabin",
              "treehouse",
              "b&b",
              "lodging",
              "bungalow",
              "groupaccommodation",
              "farm",
              "countryhouse",
              "boat",
              "villa",
              "chalet",
              "campingspot",
              "safaritent",
              "tinyhouse",
              "cabin",
              "glamping",
              "yurt",
              "gypsywagon"
            ]
          },
          "timezone": {
            "type": "string",
            "maxLength": 32,
            "minLength": 1,
            "enum": [
              "Africa/Abidjan",
              "Africa/Accra",
              "Africa/Addis_Ababa",
              "Africa/Algiers",
              "Africa/Asmara",
              "Africa/Bamako",
              "Africa/Bangui",
              "Africa/Banjul",
              "Africa/Bissau",
              "Africa/Blantyre",
              "Africa/Brazzaville",
              "Africa/Bujumbura",
              "Africa/Cairo",
              "Africa/Casablanca",
              "Africa/Ceuta",
              "Africa/Conakry",
              "Africa/Dakar",
              "Africa/Dar_es_Salaam",
              "Africa/Djibouti",
              "Africa/Douala",
              "Africa/El_Aaiun",
              "Africa/Freetown",
              "Africa/Gaborone",
              "Africa/Harare",
              "Africa/Johannesburg",
              "Africa/Juba",
              "Africa/Kampala",
              "Africa/Khartoum",
              "Africa/Kigali",
              "Africa/Kinshasa",
              "Africa/Lagos",
              "Africa/Libreville",
              "Africa/Lome",
              "Africa/Luanda",
              "Africa/Lubumbashi",
              "Africa/Lusaka",
              "Africa/Malabo",
              "Africa/Maputo",
              "Africa/Maseru",
              "Africa/Mbabane",
              "Africa/Mogadishu",
              "Africa/Monrovia",
              "Africa/Nairobi",
              "Africa/Ndjamena",
              "Africa/Niamey",
              "Africa/Nouakchott",
              "Africa/Ouagadougou",
              "Africa/Porto-Novo",
              "Africa/Sao_Tome",
              "Africa/Tripoli",
              "Africa/Tunis",
              "Africa/Windhoek",
              "America/Adak",
              "America/Anchorage",
              "America/Anguilla",
              "America/Antigua",
              "America/Araguaina",
              "America/Argentina/Buenos_Aires",
              "America/Argentina/Catamarca",
              "America/Argentina/Cordoba",
              "America/Argentina/Jujuy",
              "America/Argentina/La_Rioja",
              "America/Argentina/Mendoza",
              "America/Argentina/Rio_Gallegos",
              "America/Argentina/Salta",
              "America/Argentina/San_Juan",
              "America/Argentina/San_Luis",
              "America/Argentina/Tucuman",
              "America/Argentina/Ushuaia",
              "America/Aruba",
              "America/Asuncion",
              "America/Atikokan",
              "America/Bahia",
              "America/Bahia_Banderas",
              "America/Barbados",
              "America/Belem",
              "America/Belize",
              "America/Blanc-Sablon",
              "America/Boa_Vista",
              "America/Bogota",
              "America/Boise",
              "America/Cambridge_Bay",
              "America/Campo_Grande",
              "America/Cancun",
              "America/Caracas",
              "America/Cayenne",
              "America/Cayman",
              "America/Chicago",
              "America/Chihuahua",
              "America/Costa_Rica",
              "America/Creston",
              "America/Cuiaba",
              "America/Curacao",
              "America/Danmarkshavn",
              "America/Dawson",
              "America/Dawson_Creek",
              "America/Denver",
              "America/Detroit",
              "America/Dominica",
              "America/Edmonton",
              "America/Eirunepe",
              "America/El_Salvador",
              "America/Fort_Nelson",
              "America/Fortaleza",
              "America/Glace_Bay",
              "America/Goose_Bay",
              "America/Grand_Turk",
              "America/Grenada",
              "America/Guadeloupe",
              "America/Guatemala",
              "America/Guayaquil",
              "America/Guyana",
              "America/Halifax",
              "America/Havana",
              "America/Hermosillo",
              "America/Indiana/Indianapolis",
              "America/Indiana/Knox",
              "America/Indiana/Marengo",
              "America/Indiana/Petersburg",
              "America/Indiana/Tell_City",
              "America/Indiana/Vevay",
              "America/Indiana/Vincennes",
              "America/Indiana/Winamac",
              "America/Inuvik",
              "America/Iqaluit",
              "America/Jamaica",
              "America/Juneau",
              "America/Kentucky/Louisville",
              "America/Kentucky/Monticello",
              "America/Kralendijk",
              "America/La_Paz",
              "America/Lima",
              "America/Los_Angeles",
              "America/Lower_Princes",
              "America/Maceio",
              "America/Managua",
              "America/Manaus",
              "America/Marigot",
              "America/Martinique",
              "America/Matamoros",
              "America/Mazatlan",
              "America/Menominee",
              "America/Merida",
              "America/Metlakatla",
              "America/Mexico_City",
              "America/Miquelon",
              "America/Moncton",
              "America/Monterrey",
              "America/Montevideo",
              "America/Montserrat",
              "America/Nassau",
              "America/New_York",
              "America/Nipigon",
              "America/Nome",
              "America/Noronha",
              "America/North_Dakota/Beulah",
              "America/North_Dakota/Center",
              "America/North_Dakota/New_Salem",
              "America/Nuuk",
              "America/Ojinaga",
              "America/Panama",
              "America/Pangnirtung",
              "America/Paramaribo",
              "America/Phoenix",
              "America/Port-au-Prince",
              "America/Port_of_Spain",
              "America/Porto_Velho",
              "America/Puerto_Rico",
              "America/Punta_Arenas",
              "America/Rainy_River",
              "America/Rankin_Inlet",
              "America/Recife",
              "America/Regina",
              "America/Resolute",
              "America/Rio_Branco",
              "America/Santarem",
              "America/Santiago",
              "America/Santo_Domingo",
              "America/Sao_Paulo",
              "America/Scoresbysund",
              "America/Sitka",
              "America/St_Barthelemy",
              "America/St_Johns",
              "America/St_Kitts",
              "America/St_Lucia",
              "America/St_Thomas",
              "America/St_Vincent",
              "America/Swift_Current",
              "America/Tegucigalpa",
              "America/Thule",
              "America/Thunder_Bay",
              "America/Tijuana",
              "America/Toronto",
              "America/Tortola",
              "America/Vancouver",
              "America/Whitehorse",
              "America/Winnipeg",
              "America/Yakutat",
              "America/Yellowknife",
              "Antarctica/Casey",
              "Antarctica/Davis",
              "Antarctica/DumontDUrville",
              "Antarctica/Macquarie",
              "Antarctica/Mawson",
              "Antarctica/McMurdo",
              "Antarctica/Palmer",
              "Antarctica/Rothera",
              "Antarctica/Syowa",
              "Antarctica/Troll",
              "Antarctica/Vostok",
              "Arctic/Longyearbyen",
              "Asia/Aden",
              "Asia/Almaty",
              "Asia/Amman",
              "Asia/Anadyr",
              "Asia/Aqtau",
              "Asia/Aqtobe",
              "Asia/Ashgabat",
              "Asia/Atyrau",
              "Asia/Baghdad",
              "Asia/Bahrain",
              "Asia/Baku",
              "Asia/Bangkok",
              "Asia/Barnaul",
              "Asia/Beirut",
              "Asia/Bishkek",
              "Asia/Brunei",
              "Asia/Chita",
              "Asia/Choibalsan",
              "Asia/Colombo",
              "Asia/Damascus",
              "Asia/Dhaka",
              "Asia/Dili",
              "Asia/Dubai",
              "Asia/Dushanbe",
              "Asia/Famagusta",
              "Asia/Gaza",
              "Asia/Hebron",
              "Asia/Ho_Chi_Minh",
              "Asia/Hong_Kong",
              "Asia/Hovd",
              "Asia/Irkutsk",
              "Asia/Jakarta",
              "Asia/Jayapura",
              "Asia/Jerusalem",
              "Asia/Kabul",
              "Asia/Kamchatka",
              "Asia/Karachi",
              "Asia/Kathmandu",
              "Asia/Khandyga",
              "Asia/Kolkata",
              "Asia/Krasnoyarsk",
              "Asia/Kuala_Lumpur",
              "Asia/Kuching",
              "Asia/Kuwait",
              "Asia/Macau",
              "Asia/Magadan",
              "Asia/Makassar",
              "Asia/Manila",
              "Asia/Muscat",
              "Asia/Nicosia",
              "Asia/Novokuznetsk",
              "Asia/Novosibirsk",
              "Asia/Omsk",
              "Asia/Oral",
              "Asia/Phnom_Penh",
              "Asia/Pontianak",
              "Asia/Pyongyang",
              "Asia/Qatar",
              "Asia/Qostanay",
              "Asia/Qyzylorda",
              "Asia/Riyadh",
              "Asia/Sakhalin",
              "Asia/Samarkand",
              "Asia/Seoul",
              "Asia/Shanghai",
              "Asia/Singapore",
              "Asia/Srednekolymsk",
              "Asia/Taipei",
              "Asia/Tashkent",
              "Asia/Tbilisi",
              "Asia/Tehran",
              "Asia/Thimphu",
              "Asia/Tokyo",
              "Asia/Tomsk",
              "Asia/Ulaanbaatar",
              "Asia/Urumqi",
              "Asia/Ust-Nera",
              "Asia/Vientiane",
              "Asia/Vladivostok",
              "Asia/Yakutsk",
              "Asia/Yangon",
              "Asia/Yekaterinburg",
              "Asia/Yerevan",
              "Atlantic/Azores",
              "Atlantic/Bermuda",
              "Atlantic/Canary",
              "Atlantic/Cape_Verde",
              "Atlantic/Faroe",
              "Atlantic/Madeira",
              "Atlantic/Reykjavik",
              "Atlantic/South_Georgia",
              "Atlantic/St_Helena",
              "Atlantic/Stanley",
              "Australia/Adelaide",
              "Australia/Brisbane",
              "Australia/Broken_Hill",
              "Australia/Darwin",
              "Australia/Eucla",
              "Australia/Hobart",
              "Australia/Lindeman",
              "Australia/Lord_Howe",
              "Australia/Melbourne",
              "Australia/Perth",
              "Australia/Sydney",
              "Canada/Atlantic",
              "Canada/Central",
              "Canada/Eastern",
              "Canada/Mountain",
              "Canada/Newfoundland",
              "Canada/Pacific",
              "Europe/Amsterdam",
              "Europe/Andorra",
              "Europe/Astrakhan",
              "Europe/Athens",
              "Europe/Belgrade",
              "Europe/Berlin",
              "Europe/Bratislava",
              "Europe/Brussels",
              "Europe/Bucharest",
              "Europe/Budapest",
              "Europe/Busingen",
              "Europe/Chisinau",
              "Europe/Copenhagen",
              "Europe/Dublin",
              "Europe/Gibraltar",
              "Europe/Guernsey",
              "Europe/Helsinki",
              "Europe/Isle_of_Man",
              "Europe/Istanbul",
              "Europe/Jersey",
              "Europe/Kaliningrad",
              "Europe/Kiev",
              "Europe/Kirov",
              "Europe/Lisbon",
              "Europe/Ljubljana",
              "Europe/London",
              "Europe/Luxembourg",
              "Europe/Madrid",
              "Europe/Malta",
              "Europe/Mariehamn",
              "Europe/Minsk",
              "Europe/Monaco",
              "Europe/Moscow",
              "Europe/Oslo",
              "Europe/Paris",
              "Europe/Podgorica",
              "Europe/Prague",
              "Europe/Riga",
              "Europe/Rome",
              "Europe/Samara",
              "Europe/San_Marino",
              "Europe/Sarajevo",
              "Europe/Saratov",
              "Europe/Simferopol",
              "Europe/Skopje",
              "Europe/Sofia",
              "Europe/Stockholm",
              "Europe/Tallinn",
              "Europe/Tirane",
              "Europe/Ulyanovsk",
              "Europe/Uzhgorod",
              "Europe/Vaduz",
              "Europe/Vatican",
              "Europe/Vienna",
              "Europe/Vilnius",
              "Europe/Volgograd",
              "Europe/Warsaw",
              "Europe/Zagreb",
              "Europe/Zaporozhye",
              "Europe/Zurich",
              "GMT",
              "Indian/Antananarivo",
              "Indian/Chagos",
              "Indian/Christmas",
              "Indian/Cocos",
              "Indian/Comoro",
              "Indian/Kerguelen",
              "Indian/Mahe",
              "Indian/Maldives",
              "Indian/Mauritius",
              "Indian/Mayotte",
              "Indian/Reunion",
              "Pacific/Apia",
              "Pacific/Auckland",
              "Pacific/Bougainville",
              "Pacific/Chatham",
              "Pacific/Chuuk",
              "Pacific/Easter",
              "Pacific/Efate",
              "Pacific/Enderbury",
              "Pacific/Fakaofo",
              "Pacific/Fiji",
              "Pacific/Funafuti",
              "Pacific/Galapagos",
              "Pacific/Gambier",
              "Pacific/Guadalcanal",
              "Pacific/Guam",
              "Pacific/Honolulu",
              "Pacific/Kiritimati",
              "Pacific/Kosrae",
              "Pacific/Kwajalein",
              "Pacific/Majuro",
              "Pacific/Marquesas",
              "Pacific/Midway",
              "Pacific/Nauru",
              "Pacific/Niue",
              "Pacific/Norfolk",
              "Pacific/Noumea",
              "Pacific/Pago_Pago",
              "Pacific/Palau",
              "Pacific/Pitcairn",
              "Pacific/Pohnpei",
              "Pacific/Port_Moresby",
              "Pacific/Rarotonga",
              "Pacific/Saipan",
              "Pacific/Tahiti",
              "Pacific/Tarawa",
              "Pacific/Tongatapu",
              "Pacific/Wake",
              "Pacific/Wallis",
              "US/Alaska",
              "US/Arizona",
              "US/Central",
              "US/Eastern",
              "US/Hawaii",
              "US/Mountain",
              "US/Pacific",
              "UTC"
            ]
          },
          "currency": {
            "type": "string",
            "maxLength": 10,
            "minLength": 1,
            "enum": [
              "EUR",
              "USD",
              "GBP",
              "JPY",
              "CHF",
              "CAD",
              "AUD",
              "NZD",
              "SEK",
              "DKK",
              "NOK",
              "KRW",
              "TRY",
              "RUB",
              "MXN",
              "CNY",
              "INR",
              "BRL",
              "ZAR",
              "HKD",
              "IDR",
              "MYR",
              "PHP",
              "SGD",
              "THB",
              "VND",
              "PLN",
              "CZK",
              "HUF",
              "ILS",
              "TWD"
            ]
          },
          "title": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 100,
              "minLength": 1
            },
            "minProperties": 1,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "subtitle": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 255,
              "minLength": 1
            },
            "minProperties": 1,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "languages": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "minItems": 1,
            "uniqueItems": true,
            "description": "Language.code; alle codes moeten in Language bestaan en toegestaan zijn voor de accommodatie."
          },
          "default_language": {
            "type": "string",
            "enum": [
              "nl",
              "en",
              "de",
              "es",
              "fr",
              "it",
              "pt",
              "el",
              "hu"
            ]
          },
          "starting_price": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^-?(0|[1-9][0-9]{0,7})\\.[0-9]{2}$(?![\\s\\S])",
            "description": "Decimale string met exact 2 decimalen en maximaal 8 cijfers vóór de punt. Geen exponent, komma of JSON-getal."
          },
          "default_vat": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^-?(0|[1-9][0-9]{0,1})\\.[0-9]{1}$(?![\\s\\S])",
            "description": "Decimale string met exact 1 decimalen en maximaal 2 cijfers vóór de punt. Geen exponent, komma of JSON-getal."
          },
          "max_persons": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2147483647
          },
          "max_babies": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "max_pets": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          },
          "baby_max_age": {
            "type": "integer",
            "minimum": 0,
            "maximum": 17
          },
          "child_max_age": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25
          },
          "checkin_start": {
            "type": "string",
            "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$(?![\\s\\S])",
            "description": "Exact HH:MM:SS (00:00:00–23:59:59), lokale accommodatietijd. Geen datum, tijdzone, fracties of HH:MM.",
            "minLength": 8,
            "maxLength": 8
          },
          "checkin_end": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$(?![\\s\\S])",
            "description": "Exact HH:MM:SS (00:00:00–23:59:59), lokale accommodatietijd. Geen datum, tijdzone, fracties of HH:MM.",
            "minLength": 8,
            "maxLength": 8
          },
          "checkout_start": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$(?![\\s\\S])",
            "description": "Exact HH:MM:SS (00:00:00–23:59:59), lokale accommodatietijd. Geen datum, tijdzone, fracties of HH:MM.",
            "minLength": 8,
            "maxLength": 8
          },
          "checkout_end": {
            "type": "string",
            "pattern": "^([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]$(?![\\s\\S])",
            "description": "Exact HH:MM:SS (00:00:00–23:59:59), lokale accommodatietijd. Geen datum, tijdzone, fracties of HH:MM.",
            "minLength": 8,
            "maxLength": 8
          },
          "show_checkin_times": {
            "type": "boolean"
          },
          "smoking": {
            "type": "boolean"
          },
          "parties_events": {
            "type": "boolean"
          },
          "auto_approve_bookings": {
            "type": "boolean"
          },
          "max_booking_days_ahead": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 730
          }
        },
        "required": [],
        "additionalProperties": false,
        "example": {
          "name": "Villa aan zee",
          "checkin_start": "15:00:00",
          "checkin_end": "20:00:00",
          "checkout_start": null,
          "checkout_end": "10:00:00"
        },
        "description": "Wijzig de opgegeven algemene gegevens. Tijden gebruiken exact HH:MM:SS zonder datum of tijdzone. checkin_start en checkout_end mogen niet null zijn; checkin_end en checkout_start wel. Tijden worden afzonderlijk gevalideerd. default_language moet in languages staan; baby_max_age moet kleiner zijn dan child_max_age. Capaciteiten zijn niet-negatief. max_booking_days_ahead=null wordt 730. Vertalingen zijn alleen toegestaan voor de geselecteerde talen. De volledige wijziging wordt atomair toegepast.",
        "minProperties": 1
      },
      "AccommodationLocation": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          },
          "street": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "house_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "house_number_addition": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "postal_code": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 10
          },
          "place": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 75,
            "enum": [
              "AF",
              "AX",
              "AL",
              "DZ",
              "AS",
              "AD",
              "AO",
              "AI",
              "AQ",
              "AG",
              "AR",
              "AM",
              "AW",
              "AU",
              "AT",
              "AZ",
              "BS",
              "BH",
              "BD",
              "BB",
              "BY",
              "BE",
              "BZ",
              "BJ",
              "BM",
              "BT",
              "BO",
              "BQ",
              "BA",
              "BW",
              "BV",
              "BR",
              "IO",
              "BN",
              "BG",
              "BF",
              "BI",
              "KH",
              "CM",
              "CA",
              "CV",
              "KY",
              "CF",
              "TD",
              "CL",
              "CN",
              "CX",
              "CC",
              "CO",
              "KM",
              "CG",
              "CD",
              "CK",
              "CR",
              "CI",
              "HR",
              "CU",
              "CW",
              "CY",
              "CZ",
              "DK",
              "DJ",
              "DM",
              "DO",
              "EC",
              "EG",
              "SV",
              "GQ",
              "ER",
              "EE",
              "ET",
              "FK",
              "FO",
              "FJ",
              "FI",
              "FR",
              "GF",
              "PF",
              "TF",
              "GA",
              "GM",
              "GE",
              "DE",
              "GH",
              "GI",
              "GR",
              "GL",
              "GD",
              "GP",
              "GU",
              "GT",
              "GG",
              "GN",
              "GW",
              "GY",
              "HT",
              "HM",
              "VA",
              "HN",
              "HK",
              "HU",
              "IS",
              "IN",
              "ID",
              "IR",
              "IQ",
              "IE",
              "IM",
              "IL",
              "IT",
              "JM",
              "JP",
              "JE",
              "JO",
              "KZ",
              "KE",
              "KI",
              "KP",
              "KR",
              "KW",
              "KG",
              "LA",
              "LV",
              "LB",
              "LS",
              "LR",
              "LY",
              "LI",
              "LT",
              "LU",
              "MO",
              "MK",
              "MG",
              "MW",
              "MY",
              "MV",
              "ML",
              "MT",
              "MH",
              "MQ",
              "MR",
              "MU",
              "YT",
              "MX",
              "FM",
              "MD",
              "MC",
              "MN",
              "ME",
              "MS",
              "MA",
              "MZ",
              "MM",
              "NA",
              "NR",
              "NP",
              "NL",
              "NC",
              "NZ",
              "NI",
              "NE",
              "NG",
              "NU",
              "NF",
              "MP",
              "NO",
              "OM",
              "PK",
              "PW",
              "PS",
              "PA",
              "PG",
              "PY",
              "PE",
              "PH",
              "PN",
              "PL",
              "PT",
              "PR",
              "QA",
              "RO",
              "RU",
              "RW",
              "BL",
              "SH",
              "KN",
              "LC",
              "MF",
              "PM",
              "VC",
              "WS",
              "SM",
              "ST",
              "SA",
              "SN",
              "RS",
              "SC",
              "SL",
              "SG",
              "SX",
              "SK",
              "SI",
              "SB",
              "SO",
              "ZA",
              "GS",
              "SS",
              "ES",
              "LK",
              "SD",
              "SR",
              "SJ",
              "SZ",
              "SE",
              "CH",
              "SY",
              "TW",
              "TJ",
              "TZ",
              "TH",
              "TL",
              "TG",
              "TK",
              "TO",
              "TT",
              "TN",
              "TR",
              "TM",
              "TC",
              "TV",
              "UG",
              "UA",
              "AE",
              "GB",
              "US",
              "UM",
              "UY",
              "UZ",
              "VU",
              "VE",
              "VN",
              "VG",
              "VI",
              "WF",
              "EH",
              "YE",
              "ZM",
              "ZW",
              null
            ]
          },
          "lat": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^-?((0|[1-8]?[0-9])\\.[0-9]{7}|90\\.0{7})$(?![\\s\\S])",
            "description": "Decimale string met exact 7 decimalen en maximaal 3 cijfers vóór de punt. Geen exponent, komma of JSON-getal."
          },
          "lon": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^-?((0|[1-9][0-9]?|1[0-7][0-9])\\.[0-9]{7}|180\\.0{7})$(?![\\s\\S])",
            "description": "Decimale string met exact 7 decimalen en maximaal 3 cijfers vóór de punt. Geen exponent, komma of JSON-getal."
          }
        },
        "required": [
          "id",
          "updated_at",
          "street",
          "house_number",
          "house_number_addition",
          "postal_code",
          "place",
          "country",
          "lat",
          "lon"
        ],
        "additionalProperties": false,
        "example": {
          "id": 123,
          "street": "Voorbeeldstraat",
          "house_number": "12",
          "house_number_addition": null,
          "postal_code": "1234AB",
          "place": "Voorbeeldstad",
          "country": "NL",
          "lat": "52.1000000",
          "lon": "5.1000000",
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "AccommodationLocationPatch": {
        "type": "object",
        "properties": {
          "street": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1
          },
          "house_number": {
            "type": "string",
            "maxLength": 100,
            "minLength": 1
          },
          "house_number_addition": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "postal_code": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 10
          },
          "place": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1
          },
          "country": {
            "type": "string",
            "maxLength": 75,
            "minLength": 1,
            "enum": [
              "AF",
              "AX",
              "AL",
              "DZ",
              "AS",
              "AD",
              "AO",
              "AI",
              "AQ",
              "AG",
              "AR",
              "AM",
              "AW",
              "AU",
              "AT",
              "AZ",
              "BS",
              "BH",
              "BD",
              "BB",
              "BY",
              "BE",
              "BZ",
              "BJ",
              "BM",
              "BT",
              "BO",
              "BQ",
              "BA",
              "BW",
              "BV",
              "BR",
              "IO",
              "BN",
              "BG",
              "BF",
              "BI",
              "KH",
              "CM",
              "CA",
              "CV",
              "KY",
              "CF",
              "TD",
              "CL",
              "CN",
              "CX",
              "CC",
              "CO",
              "KM",
              "CG",
              "CD",
              "CK",
              "CR",
              "CI",
              "HR",
              "CU",
              "CW",
              "CY",
              "CZ",
              "DK",
              "DJ",
              "DM",
              "DO",
              "EC",
              "EG",
              "SV",
              "GQ",
              "ER",
              "EE",
              "ET",
              "FK",
              "FO",
              "FJ",
              "FI",
              "FR",
              "GF",
              "PF",
              "TF",
              "GA",
              "GM",
              "GE",
              "DE",
              "GH",
              "GI",
              "GR",
              "GL",
              "GD",
              "GP",
              "GU",
              "GT",
              "GG",
              "GN",
              "GW",
              "GY",
              "HT",
              "HM",
              "VA",
              "HN",
              "HK",
              "HU",
              "IS",
              "IN",
              "ID",
              "IR",
              "IQ",
              "IE",
              "IM",
              "IL",
              "IT",
              "JM",
              "JP",
              "JE",
              "JO",
              "KZ",
              "KE",
              "KI",
              "KP",
              "KR",
              "KW",
              "KG",
              "LA",
              "LV",
              "LB",
              "LS",
              "LR",
              "LY",
              "LI",
              "LT",
              "LU",
              "MO",
              "MK",
              "MG",
              "MW",
              "MY",
              "MV",
              "ML",
              "MT",
              "MH",
              "MQ",
              "MR",
              "MU",
              "YT",
              "MX",
              "FM",
              "MD",
              "MC",
              "MN",
              "ME",
              "MS",
              "MA",
              "MZ",
              "MM",
              "NA",
              "NR",
              "NP",
              "NL",
              "NC",
              "NZ",
              "NI",
              "NE",
              "NG",
              "NU",
              "NF",
              "MP",
              "NO",
              "OM",
              "PK",
              "PW",
              "PS",
              "PA",
              "PG",
              "PY",
              "PE",
              "PH",
              "PN",
              "PL",
              "PT",
              "PR",
              "QA",
              "RO",
              "RU",
              "RW",
              "BL",
              "SH",
              "KN",
              "LC",
              "MF",
              "PM",
              "VC",
              "WS",
              "SM",
              "ST",
              "SA",
              "SN",
              "RS",
              "SC",
              "SL",
              "SG",
              "SX",
              "SK",
              "SI",
              "SB",
              "SO",
              "ZA",
              "GS",
              "SS",
              "ES",
              "LK",
              "SD",
              "SR",
              "SJ",
              "SZ",
              "SE",
              "CH",
              "SY",
              "TW",
              "TJ",
              "TZ",
              "TH",
              "TL",
              "TG",
              "TK",
              "TO",
              "TT",
              "TN",
              "TR",
              "TM",
              "TC",
              "TV",
              "UG",
              "UA",
              "AE",
              "GB",
              "US",
              "UM",
              "UY",
              "UZ",
              "VU",
              "VE",
              "VN",
              "VG",
              "VI",
              "WF",
              "EH",
              "YE",
              "ZM",
              "ZW"
            ]
          },
          "lat": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^-?((0|[1-8]?[0-9])\\.[0-9]{7}|90\\.0{7})$(?![\\s\\S])",
            "description": "Decimale string met exact 7 decimalen en maximaal 3 cijfers vóór de punt. Geen exponent, komma of JSON-getal."
          },
          "lon": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^-?((0|[1-9][0-9]?|1[0-7][0-9])\\.[0-9]{7}|180\\.0{7})$(?![\\s\\S])",
            "description": "Decimale string met exact 7 decimalen en maximaal 3 cijfers vóór de punt. Geen exponent, komma of JSON-getal."
          }
        },
        "required": [],
        "additionalProperties": false,
        "example": {
          "street": "Nieuwe straat",
          "house_number": "8"
        },
        "description": "Adreswijziging zonder coördinaten wist lat/lon. Geef beide coördinaten samen op of beide null. Er vindt geen automatische geocoding plaats.",
        "minProperties": 1,
        "dependentRequired": {
          "lat": [
            "lon"
          ],
          "lon": [
            "lat"
          ]
        },
        "allOf": [
          {
            "if": {
              "required": [
                "lat"
              ],
              "properties": {
                "lat": {
                  "type": "null"
                }
              }
            },
            "then": {
              "properties": {
                "lon": {
                  "type": "null"
                }
              }
            }
          },
          {
            "if": {
              "required": [
                "lon"
              ],
              "properties": {
                "lon": {
                  "type": "null"
                }
              }
            },
            "then": {
              "properties": {
                "lat": {
                  "type": "null"
                }
              }
            }
          }
        ]
      },
      "GuestContact": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 254
          },
          "telephone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          }
        },
        "required": [
          "first_name",
          "last_name",
          "email",
          "telephone"
        ],
        "additionalProperties": false,
        "example": {
          "first_name": "Jamie",
          "last_name": "Voorbeeld",
          "email": "jamie@example.com",
          "telephone": null
        }
      },
      "BookingSummary": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50,
            "enum": [
              "request",
              "accepted",
              "declined",
              "cancelled",
              null
            ]
          },
          "channel": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "check_in": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "adults": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "kids": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "babies": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "pets": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "created_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          }
        },
        "required": [
          "id",
          "accommodation_id",
          "status",
          "channel",
          "check_in",
          "check_out",
          "adults",
          "kids",
          "babies",
          "pets",
          "created_at",
          "updated_at"
        ],
        "additionalProperties": false,
        "example": {
          "id": 456,
          "accommodation_id": 123,
          "status": "accepted",
          "channel": "direct",
          "check_in": "2026-11-01",
          "check_out": "2026-11-08",
          "adults": 2,
          "kids": 0,
          "babies": 0,
          "pets": 0,
          "created_at": "2026-09-29T10:00:00Z",
          "updated_at": "2026-09-29T10:00:00Z"
        },
        "description": "Historische ontbrekende waarden blijven null. Geen gastcontact in de lijst."
      },
      "Booking": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "status": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50,
            "enum": [
              "request",
              "accepted",
              "declined",
              "cancelled",
              null
            ]
          },
          "channel": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "check_in": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "adults": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "kids": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "babies": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "pets": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "created_at": {
            "type": [
              "string",
              "null"
            ],
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          },
          "guest": {
            "anyOf": [
              {
                "$ref": "#/components/schemas/GuestContact"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "id",
          "accommodation_id",
          "status",
          "channel",
          "check_in",
          "check_out",
          "adults",
          "kids",
          "babies",
          "pets",
          "created_at",
          "updated_at",
          "guest"
        ],
        "additionalProperties": false,
        "example": {
          "id": 456,
          "accommodation_id": 123,
          "status": "accepted",
          "channel": "direct",
          "check_in": "2026-11-01",
          "check_out": "2026-11-08",
          "adults": 2,
          "kids": 0,
          "babies": 0,
          "pets": 0,
          "created_at": "2026-09-29T10:00:00Z",
          "updated_at": "2026-09-29T10:00:00Z",
          "guest": {
            "first_name": "Jamie",
            "last_name": "Voorbeeld",
            "email": "jamie@example.com",
            "telephone": null
          }
        },
        "description": "Detail bevat minimaal gastcontact voor de accountkey; geen afzonderlijke gastscope. Geen privénotities, identiteitsdocumenten, toegangscodes of betaalgegevens."
      },
      "Party": {
        "type": "object",
        "properties": {
          "adults": {
            "type": "integer",
            "minimum": 1,
            "maximum": 2147483647
          },
          "kids": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          },
          "babies": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          },
          "pets": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          }
        },
        "required": [
          "adults"
        ],
        "additionalProperties": false
      },
      "AvailabilityDay": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "available": {
            "type": "boolean"
          },
          "arrival_allowed": {
            "type": "boolean"
          },
          "departure_allowed": {
            "type": "boolean"
          },
          "min_stay": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1
          },
          "max_stay": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1
          }
        },
        "required": [
          "date",
          "available",
          "arrival_allowed",
          "departure_allowed",
          "min_stay",
          "max_stay"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-11-01",
          "available": true,
          "arrival_allowed": true,
          "departure_allowed": true,
          "min_stay": 3,
          "max_stay": null
        }
      },
      "AvailabilityCalendar": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "timezone": {
            "type": "string"
          },
          "from": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "to": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AvailabilityDay"
            }
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          }
        },
        "required": [
          "accommodation_id",
          "timezone",
          "from",
          "to",
          "days",
          "updated_at"
        ],
        "additionalProperties": false,
        "example": {
          "accommodation_id": 123,
          "timezone": "Europe/Amsterdam",
          "from": "2026-11-01",
          "to": "2026-11-02",
          "days": [
            {
              "date": "2026-11-01",
              "available": true,
              "arrival_allowed": true,
              "departure_allowed": true,
              "min_stay": 3,
              "max_stay": null
            }
          ],
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "AvailabilityCheckInput": {
        "type": "object",
        "properties": {
          "accommodation_ids": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 1
            },
            "minItems": 1,
            "maxItems": 20,
            "uniqueItems": true
          },
          "check_in": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "party": {
            "$ref": "#/components/schemas/Party"
          }
        },
        "required": [
          "accommodation_ids",
          "check_in",
          "check_out",
          "party"
        ],
        "additionalProperties": false,
        "example": {
          "accommodation_ids": [
            123
          ],
          "check_in": "2026-11-01",
          "check_out": "2026-11-08",
          "party": {
            "adults": 2
          }
        }
      },
      "AvailabilityCheck": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "accommodation_id": {
                  "type": "integer",
                  "minimum": 1
                },
                "bookable": {
                  "type": "boolean"
                },
                "reasons": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "occupied",
                      "arrival_not_allowed",
                      "departure_not_allowed",
                      "minimum_stay",
                      "maximum_stay",
                      "capacity_exceeded",
                      "pets_not_allowed",
                      "outside_booking_horizon",
                      "missing_rate",
                      "gap_not_allowed"
                    ]
                  }
                }
              },
              "required": [
                "accommodation_id",
                "bookable",
                "reasons"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "results"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "accommodation_id": 123,
              "bookable": true,
              "reasons": []
            }
          ]
        }
      },
      "RateDay": {
        "type": "object",
        "properties": {
          "date": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "amount": {
            "type": [
              "string",
              "null"
            ],
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "min_stay": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1
          },
          "max_stay": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1
          },
          "arrival_allowed": {
            "type": "boolean"
          },
          "departure_allowed": {
            "type": "boolean"
          },
          "source": {
            "type": "string",
            "enum": [
              "default",
              "season",
              "override",
              "unavailable"
            ]
          }
        },
        "required": [
          "date",
          "amount",
          "min_stay",
          "max_stay",
          "arrival_allowed",
          "departure_allowed",
          "source"
        ],
        "additionalProperties": false,
        "example": {
          "date": "2026-11-01",
          "amount": "125.00",
          "min_stay": 3,
          "max_stay": null,
          "arrival_allowed": true,
          "departure_allowed": true,
          "source": "season"
        }
      },
      "Rates": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$(?![\\s\\S])"
          },
          "from": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "to": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "days": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RateDay"
            }
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          }
        },
        "required": [
          "accommodation_id",
          "currency",
          "from",
          "to",
          "days",
          "updated_at"
        ],
        "additionalProperties": false,
        "example": {
          "accommodation_id": 123,
          "currency": "EUR",
          "from": "2026-11-01",
          "to": "2026-11-02",
          "days": [
            {
              "date": "2026-11-01",
              "amount": "125.00",
              "min_stay": 3,
              "max_stay": null,
              "arrival_allowed": true,
              "departure_allowed": true,
              "source": "season"
            }
          ],
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "QuoteInput": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "check_in": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "party": {
            "$ref": "#/components/schemas/Party"
          },
          "coupon_code": {
            "type": "string"
          },
          "extras": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "extra_id": {
                  "type": "integer",
                  "minimum": 1
                },
                "quantity": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "extra_id",
                "quantity"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "accommodation_id",
          "check_in",
          "check_out",
          "party"
        ],
        "additionalProperties": false,
        "example": {
          "accommodation_id": 123,
          "check_in": "2026-11-01",
          "check_out": "2026-11-08",
          "party": {
            "adults": 2,
            "kids": 0,
            "babies": 0,
            "pets": 0
          }
        }
      },
      "Quote": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "bookable": {
            "type": "boolean"
          },
          "reasons": {
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "occupied",
                "arrival_not_allowed",
                "departure_not_allowed",
                "minimum_stay",
                "maximum_stay",
                "capacity_exceeded",
                "pets_not_allowed",
                "outside_booking_horizon",
                "missing_rate",
                "gap_not_allowed"
              ]
            }
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$(?![\\s\\S])"
          },
          "rent": {
            "type": [
              "string",
              "null"
            ],
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "nights": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
                  "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
                  "minLength": 10,
                  "maxLength": 10
                },
                "amount": {
                  "type": "string",
                  "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
                  "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
                }
              },
              "required": [
                "date",
                "amount"
              ],
              "additionalProperties": false
            },
            "description": "Effectieve netto huur per nacht; pakketprijzen en kortingen worden naar verhouding van het nachttarief toegerekend. De som is exact rent."
          },
          "extras": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string"
                },
                "amount": {
                  "type": "string",
                  "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
                  "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
                }
              },
              "required": [
                "label",
                "amount"
              ],
              "additionalProperties": false
            }
          },
          "discounts": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string"
                },
                "amount": {
                  "type": "string",
                  "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
                  "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
                }
              },
              "required": [
                "label",
                "amount"
              ],
              "additionalProperties": false
            },
            "description": "Informatieve uitsplitsing: deze kortingen zijn al verwerkt in rent en total."
          },
          "taxes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "label": {
                  "type": "string"
                },
                "amount": {
                  "type": "string",
                  "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
                  "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
                }
              },
              "required": [
                "label",
                "amount"
              ],
              "additionalProperties": false
            },
            "description": "De bestaande berekening rekent met ingevoerde brutoprijzen. Er is geen aparte belastingregel in het huidige prijsmodel; deze lijst is leeg."
          },
          "total": {
            "type": [
              "string",
              "null"
            ],
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "deposit": {
            "type": [
              "string",
              "null"
            ],
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "tax_inclusive": {
            "type": "boolean"
          },
          "payment_schedule": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "due_date": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
                  "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
                  "minLength": 10,
                  "maxLength": 10
                },
                "amount": {
                  "type": "string",
                  "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
                  "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
                }
              },
              "required": [
                "due_date",
                "amount"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "accommodation_id",
          "bookable",
          "reasons",
          "currency",
          "rent",
          "nights",
          "extras",
          "discounts",
          "taxes",
          "total",
          "deposit",
          "tax_inclusive",
          "payment_schedule"
        ],
        "additionalProperties": false,
        "example": {
          "accommodation_id": 123,
          "bookable": false,
          "reasons": [
            "missing_rate"
          ],
          "currency": "EUR",
          "rent": null,
          "nights": [],
          "extras": [],
          "discounts": [],
          "taxes": [],
          "total": null,
          "deposit": null,
          "tax_inclusive": true,
          "payment_schedule": []
        },
        "description": "Momentopname van de verblijfsprijs, zonder prijslock of reservering. rent is de huurprijs na kortingen; discounts is een informatieve uitsplitsing die niet opnieuw mag worden afgetrokken. total is het berekende verblijfstotaal inclusief toepasselijke extra kosten; de borg staat apart in deposit. Bedragen gebruiken twee decimalen. De prijzen zijn bruto en taxes is leeg. Bij een niet-boekbaar verblijf zijn total en rent null. Het betaalplan is indicatief."
      },
      "Content": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "description": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          }
        },
        "required": [
          "accommodation_id",
          "description",
          "updated_at"
        ],
        "additionalProperties": false,
        "example": {
          "accommodation_id": 123,
          "description": {
            "nl": "<p>Welkom in onze villa.</p>"
          },
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "Image": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "alt": {
            "type": [
              "string",
              "null"
            ]
          },
          "position": {
            "type": "integer",
            "minimum": 0
          },
          "width": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1
          },
          "height": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1
          }
        },
        "required": [
          "id",
          "url",
          "alt",
          "position",
          "width",
          "height"
        ],
        "additionalProperties": false,
        "example": {
          "id": 21,
          "url": "https://images.example.com/villa.jpg",
          "alt": "Buitenzijde villa",
          "position": 0,
          "width": 1600,
          "height": 900
        }
      },
      "Room": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 40,
            "enum": [
              "bedroom",
              "bathroom",
              "livingroom",
              "playroom",
              "studyroom",
              "tvroom",
              "diningroom",
              "generic_room",
              "kitchen",
              "balcony",
              "terrace",
              "courtyard",
              "roofterrace",
              "patio",
              "studio",
              "tuin",
              null
            ]
          },
          "situation": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255,
            "enum": [
              "sous_terrain",
              "begane_grond",
              "1e_verdieping",
              "2e_verdieping",
              "3e_verdieping",
              "4e_verdieping",
              "5e_verdieping",
              "zolder",
              "dak",
              "attached",
              "elders",
              null
            ]
          },
          "surface": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "name": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 255
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "beds": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Bed"
            }
          }
        },
        "required": [
          "id",
          "accommodation_id",
          "type",
          "situation",
          "surface",
          "name",
          "beds"
        ],
        "additionalProperties": false,
        "description": "Room en Bed uit het dashboard. Kamers zijn inrichting, geen boekbare units. beds is alleen-lezen in deze kamer-PATCH; bedbeheer is een afzonderlijke flow.",
        "example": {
          "id": 31,
          "accommodation_id": 123,
          "type": "bedroom",
          "name": {
            "nl": "Slaapkamer 1"
          },
          "situation": "begane_grond",
          "surface": 18,
          "beds": [
            {
              "id": 71,
              "type": "2pers_bed",
              "number": 1
            }
          ]
        }
      },
      "Rules": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "description": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          }
        },
        "required": [
          "accommodation_id",
          "description"
        ],
        "additionalProperties": false,
        "description": "De geldende huisregels van de accommodatie.",
        "example": {
          "accommodation_id": 123,
          "description": {
            "nl": "Rust na 22:00 uur."
          }
        }
      },
      "Conditions": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "conditions": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          }
        },
        "required": [
          "accommodation_id",
          "conditions"
        ],
        "additionalProperties": false,
        "description": "De geldende voorwaarden van de accommodatie, per taal.",
        "example": {
          "accommodation_id": 123,
          "conditions": {
            "nl": "<p>Onze boekingsvoorwaarden.</p>"
          }
        }
      },
      "JobAccepted": {
        "type": "object",
        "properties": {
          "job_id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "queued"
            ]
          }
        },
        "required": [
          "job_id",
          "status"
        ],
        "additionalProperties": false,
        "example": {
          "job_id": "26ea5d34-0b4b-4181-9a5a-e5138c058e56",
          "status": "queued"
        }
      },
      "Event": {
        "type": "object",
        "properties": {
          "event_id": {
            "type": "string",
            "format": "uuid"
          },
          "event_type": {
            "type": "string",
            "enum": [
              "booking.created",
              "booking.updated",
              "booking.cancelled",
              "accommodation.updated",
              "availability.updated",
              "rates.updated"
            ]
          },
          "schema_version": {
            "type": "string",
            "enum": [
              "1"
            ]
          },
          "occurred_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          },
          "resource_type": {
            "type": "string",
            "enum": [
              "booking",
              "accommodation",
              "availability",
              "rates"
            ]
          },
          "resource_id": {
            "type": "integer",
            "minimum": 1
          },
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "sequence": {
            "type": "string",
            "pattern": "^\\d+$(?![\\s\\S])"
          }
        },
        "required": [
          "event_id",
          "event_type",
          "schema_version",
          "occurred_at",
          "resource_type",
          "resource_id",
          "accommodation_id",
          "sequence"
        ],
        "additionalProperties": false,
        "example": {
          "event_id": "86f1bdf8-736b-40ea-82ee-b376ee2bec9a",
          "event_type": "booking.updated",
          "schema_version": "1",
          "occurred_at": "2026-09-29T10:00:00Z",
          "resource_type": "booking",
          "resource_id": 456,
          "accommodation_id": 123,
          "sequence": "1042"
        }
      },
      "Change": {
        "type": "object",
        "properties": {
          "cursor": {
            "type": "string"
          },
          "resource_type": {
            "type": "string"
          },
          "resource_id": {
            "type": "integer",
            "minimum": 1
          },
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "change_type": {
            "type": "string",
            "enum": [
              "created",
              "updated",
              "deleted",
              "access_revoked"
            ]
          },
          "occurred_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          }
        },
        "required": [
          "cursor",
          "resource_type",
          "resource_id",
          "accommodation_id",
          "change_type",
          "occurred_at"
        ],
        "additionalProperties": false,
        "example": {
          "cursor": "opaque-1042",
          "resource_type": "booking",
          "resource_id": 456,
          "accommodation_id": 123,
          "change_type": "updated",
          "occurred_at": "2026-09-29T10:00:00Z"
        }
      },
      "Changes": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Change"
            }
          },
          "next_cursor": {
            "type": "string"
          },
          "has_more": {
            "type": "boolean"
          }
        },
        "required": [
          "results",
          "next_cursor",
          "has_more"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "cursor": "opaque-1042",
              "resource_type": "booking",
              "resource_id": 456,
              "accommodation_id": 123,
              "change_type": "updated",
              "occurred_at": "2026-09-29T10:00:00Z"
            }
          ],
          "next_cursor": "opaque-1042",
          "has_more": false
        },
        "description": "Zonder cursor: lege results en huidig watermark. Lees daarna de volledige lijsten en vervolg de feed vanaf dit watermark. Bewaar de cursor ook bij lege results. Historie is 30 dagen beschikbaar; verlopen of ontbrekende historie geeft 410. Tombstones gelden uitsluitend voor eerder toegankelijke resources. Vergelijk periodiek met de volledige resources: niet alle achtergrondwijzigingen zijn gegarandeerd in de feed opgenomen."
      },
      "BookingCreate": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "check_in": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "party": {
            "$ref": "#/components/schemas/Party"
          },
          "guest": {
            "$ref": "#/components/schemas/GuestContact"
          },
          "external_reference": {
            "type": "string",
            "maxLength": 100
          },
          "extras": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "extra_id": {
                  "type": "integer",
                  "minimum": 1
                },
                "quantity": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "extra_id",
                "quantity"
              ],
              "additionalProperties": false
            }
          },
          "coupon_code": {
            "type": "string"
          }
        },
        "required": [
          "accommodation_id",
          "check_in",
          "check_out",
          "party",
          "guest",
          "external_reference"
        ],
        "additionalProperties": false,
        "example": {
          "accommodation_id": 123,
          "check_in": "2026-11-01",
          "check_out": "2026-11-08",
          "party": {
            "adults": 2,
            "kids": 0,
            "babies": 0,
            "pets": 0
          },
          "guest": {
            "first_name": "Jamie",
            "last_name": "Voorbeeld",
            "email": "jamie@example.com",
            "telephone": null
          },
          "external_reference": "my-integration-001"
        }
      },
      "BookingPatch": {
        "type": "object",
        "properties": {
          "check_in": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "party": {
            "$ref": "#/components/schemas/Party"
          },
          "guest": {
            "$ref": "#/components/schemas/GuestContact"
          },
          "extras": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "extra_id": {
                  "type": "integer",
                  "minimum": 1
                },
                "quantity": {
                  "type": "integer",
                  "minimum": 1
                }
              },
              "required": [
                "extra_id",
                "quantity"
              ],
              "additionalProperties": false
            }
          },
          "coupon_code": {
            "type": "string"
          }
        },
        "required": [],
        "additionalProperties": false,
        "example": {
          "check_in": "2026-11-02",
          "check_out": "2026-11-09"
        },
        "description": "Geen willekeurige statuswijziging of financiële actie. Verblijf/prijs worden opnieuw getoetst. Alleen bewerkbare directe boekingen; OTA-bronbeleid kan 409 geven.",
        "minProperties": 1
      },
      "BookingAction": {
        "type": "object",
        "properties": {
          "reason": {
            "type": "string",
            "minLength": 1,
            "maxLength": 500
          },
          "notify_guest": {
            "type": "boolean"
          }
        },
        "required": [
          "reason",
          "notify_guest"
        ],
        "additionalProperties": false,
        "example": {
          "reason": "Op verzoek van de gast",
          "notify_guest": false
        },
        "description": "accept/decline vanaf request; cancel vanaf request of accepted. notify_guest bepaalt de bestaande gastmelding na commit. Geen impliciete betaalverzoeken, incasso of refund."
      },
      "BlockInput": {
        "type": "object",
        "properties": {
          "check_in": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "label": {
            "type": "string",
            "maxLength": 100
          }
        },
        "required": [
          "check_in",
          "check_out",
          "label"
        ],
        "additionalProperties": false,
        "example": {
          "check_in": "2026-12-01",
          "check_out": "2026-12-04",
          "label": "Eigen gebruik"
        }
      },
      "Block": {
        "type": "object",
        "properties": {
          "check_in": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "label": {
            "type": "string",
            "maxLength": 100
          },
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          }
        },
        "required": [
          "check_in",
          "check_out",
          "label",
          "id",
          "accommodation_id",
          "updated_at"
        ],
        "additionalProperties": false,
        "example": {
          "check_in": "2026-12-01",
          "check_out": "2026-12-04",
          "label": "Eigen gebruik",
          "id": 81,
          "accommodation_id": 123,
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "BlockPatch": {
        "type": "object",
        "properties": {
          "check_in": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "check_out": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "label": {
            "type": "string",
            "maxLength": 100
          }
        },
        "required": [],
        "additionalProperties": false,
        "example": {
          "check_out": "2026-12-05"
        },
        "description": "Alleen aangeleverde velden wijzigen; onbekende velden geven 400.",
        "minProperties": 1
      },
      "RatesPatch": {
        "type": "object",
        "properties": {
          "days": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "date": {
                  "type": "string",
                  "format": "date",
                  "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
                  "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
                  "minLength": 10,
                  "maxLength": 10
                },
                "amount": {
                  "type": "string",
                  "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
                  "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
                },
                "min_stay": {
                  "type": "integer",
                  "minimum": 1,
                  "maximum": 730
                },
                "max_stay": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "minimum": 1,
                  "maximum": 730
                },
                "arrival_allowed": {
                  "type": "boolean"
                },
                "departure_allowed": {
                  "type": "boolean"
                }
              },
              "required": [
                "date"
              ],
              "additionalProperties": false,
              "minProperties": 2
            },
            "minItems": 1,
            "maxItems": 366
          }
        },
        "required": [
          "days"
        ],
        "additionalProperties": false,
        "example": {
          "days": [
            {
              "date": "2026-11-01",
              "amount": "140.00",
              "min_stay": 3
            }
          ]
        },
        "description": "Unieke datums; per dag minstens één wijziging naast date. Geheel atomair toepassen. Geen gedeeltelijke succesresponse. Lokale opslag betekent niet dat alle kanalen al zijn bijgewerkt."
      },
      "Guest": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "last_name": {
            "type": [
              "string",
              "null"
            ]
          },
          "email": {
            "type": [
              "string",
              "null"
            ],
            "format": "email"
          },
          "telephone": {
            "type": [
              "string",
              "null"
            ]
          },
          "id": {
            "type": "integer",
            "minimum": 1
          }
        },
        "required": [
          "first_name",
          "last_name",
          "email",
          "telephone",
          "id"
        ],
        "additionalProperties": false,
        "example": {
          "first_name": "Jamie",
          "last_name": "Voorbeeld",
          "email": "jamie@example.com",
          "telephone": null,
          "id": 92
        }
      },
      "Thread": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "booking_id": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1
          },
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "channel": {
            "type": "string"
          },
          "subject": {
            "type": [
              "string",
              "null"
            ]
          },
          "updated_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          }
        },
        "required": [
          "id",
          "booking_id",
          "accommodation_id",
          "channel",
          "subject",
          "updated_at"
        ],
        "additionalProperties": false,
        "example": {
          "id": 301,
          "booking_id": 456,
          "accommodation_id": 123,
          "channel": "email",
          "subject": "Vraag over aankomst",
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "Message": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "thread_id": {
            "type": "integer",
            "minimum": 1
          },
          "direction": {
            "type": "string",
            "enum": [
              "inbound",
              "outbound"
            ]
          },
          "body": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "received",
              "queued",
              "sent",
              "failed"
            ]
          },
          "created_at": {
            "type": "string",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch.",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])"
          }
        },
        "required": [
          "id",
          "thread_id",
          "direction",
          "body",
          "status",
          "created_at"
        ],
        "additionalProperties": false,
        "example": {
          "id": 401,
          "thread_id": 301,
          "direction": "outbound",
          "body": "Welkom vanaf 15:00 uur.",
          "status": "queued",
          "created_at": "2026-09-29T10:00:00Z"
        }
      },
      "BookingPayments": {
        "type": "object",
        "properties": {
          "booking_id": {
            "type": "integer",
            "minimum": 1
          },
          "currency": {
            "type": "string",
            "pattern": "^[A-Z]{3}$(?![\\s\\S])"
          },
          "amount_due": {
            "type": "string",
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "amount_paid": {
            "type": "string",
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "amount_refunded": {
            "type": "string",
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "deposit_due": {
            "type": "string",
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "payout_amount": {
            "type": [
              "string",
              "null"
            ],
            "description": "Niet-negatief bedrag met twee decimalen. Valuta staat bij de resource.",
            "pattern": "^\\d+\\.\\d{2}$(?![\\s\\S])"
          },
          "status": {
            "type": "string",
            "enum": [
              "unpaid",
              "partially_paid",
              "paid",
              "partially_refunded",
              "refunded"
            ]
          }
        },
        "required": [
          "booking_id",
          "currency",
          "amount_due",
          "amount_paid",
          "amount_refunded",
          "deposit_due",
          "payout_amount",
          "status"
        ],
        "additionalProperties": false,
        "example": {
          "booking_id": 456,
          "currency": "EUR",
          "amount_due": "875.00",
          "amount_paid": "400.00",
          "amount_refunded": "0.00",
          "deposit_due": "150.00",
          "payout_amount": null,
          "status": "partially_paid"
        },
        "description": "amount_due is de som van boekingsregels exclusief borg en verbruikskosten. deposit_due bevat de borg. amount_paid bevat positieve betalingstransacties vóór terugbetalingen; amount_refunded bevat negatieve transacties en geregistreerde borgterugbetalingen. payout_amount is null wanneer niet vastgesteld. Er worden geen kaart- of bankgegevens getoond."
      },
      "ReferenceItem": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "label": {
            "type": "object",
            "propertyNames": {
              "pattern": "^[a-z]{2}(-[A-Z]{2})?$(?![\\s\\S])"
            },
            "additionalProperties": {
              "type": "string"
            },
            "description": "Taalcode → tekst. PATCH voegt deze talen samen; overige vertalingen blijven staan."
          }
        },
        "required": [
          "code",
          "label"
        ],
        "additionalProperties": false,
        "example": {
          "code": "NL",
          "label": {
            "nl": "Nederland",
            "en": "Netherlands"
          }
        }
      },
      "ContentPatch": {
        "type": "object",
        "properties": {
          "description": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 1,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          }
        },
        "required": [],
        "additionalProperties": false,
        "example": {
          "description": {
            "nl": "<p>Onze vernieuwde villa.</p>"
          }
        },
        "description": "Uitsluitend Object.description per taal wijzigen, zoals Mijn Accommodatie → Teksten. Geen price_list. Gevalideerde/schone rich text volgens dezelfde HTML-allowlist als het dashboard; onbekende velden geven 400.",
        "minProperties": 1
      },
      "AccountUserPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AccountUser"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 43,
              "first_name": "Sam",
              "last_name": "Voorbeeld",
              "email": "sam@example.com",
              "active": true,
              "user_active": true,
              "accommodation_access": [
                {
                  "accommodation_id": 123,
                  "permissions": {
                    "object": {
                      "general": "read"
                    }
                  }
                }
              ]
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "AccommodationPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Accommodation"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 123,
              "name": "Villa Voorbeeld",
              "type": "villa",
              "timezone": "Europe/Amsterdam",
              "currency": "EUR",
              "updated_at": "2026-09-29T10:00:00Z"
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "BookingSummaryPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/BookingSummary"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 456,
              "accommodation_id": 123,
              "status": "accepted",
              "channel": "direct",
              "check_in": "2026-11-01",
              "check_out": "2026-11-08",
              "adults": 2,
              "kids": 0,
              "babies": 0,
              "pets": 0,
              "created_at": "2026-09-29T10:00:00Z",
              "updated_at": "2026-09-29T10:00:00Z"
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "ImagePage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Image"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 21,
              "url": "https://images.example.com/villa.jpg",
              "alt": "Buitenzijde villa",
              "position": 0,
              "width": 1600,
              "height": 900
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "RoomPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Room"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 31,
              "accommodation_id": 123,
              "type": "bedroom",
              "name": {
                "nl": "Slaapkamer 1"
              },
              "situation": "begane_grond",
              "surface": 18,
              "beds": [
                {
                  "id": 71,
                  "type": "2pers_bed",
                  "number": 1
                }
              ]
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "BlockPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Block"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "check_in": "2026-12-01",
              "check_out": "2026-12-04",
              "label": "Eigen gebruik",
              "id": 81,
              "accommodation_id": 123,
              "updated_at": "2026-09-29T10:00:00Z"
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "GuestPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Guest"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "first_name": "Jamie",
              "last_name": "Voorbeeld",
              "email": "jamie@example.com",
              "telephone": null,
              "id": 92
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "ThreadPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Thread"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 301,
              "booking_id": 456,
              "accommodation_id": 123,
              "channel": "email",
              "subject": "Vraag over aankomst",
              "updated_at": "2026-09-29T10:00:00Z"
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "MessagePage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Message"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 401,
              "thread_id": 301,
              "direction": "outbound",
              "body": "Welkom vanaf 15:00 uur.",
              "status": "queued",
              "created_at": "2026-09-29T10:00:00Z"
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "ReferenceItemPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ReferenceItem"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "code": "NL",
              "label": {
                "nl": "Nederland",
                "en": "Netherlands"
              }
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "RulesPatch": {
        "type": "object",
        "properties": {
          "description": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 1,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          }
        },
        "required": [],
        "additionalProperties": false,
        "minProperties": 1,
        "description": "Alleen het overeenkomstige vertaalde dashboardveld wijzigen; veilige HTML en server-side vertalingsvalidatie vóór opslag.",
        "example": {
          "description": {
            "nl": "Rust na 22:00 uur."
          }
        }
      },
      "ConditionsPatch": {
        "type": "object",
        "properties": {
          "conditions": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 1,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          }
        },
        "required": [],
        "additionalProperties": false,
        "minProperties": 1,
        "description": "Alleen het overeenkomstige vertaalde dashboardveld wijzigen; veilige HTML en server-side vertalingsvalidatie vóór opslag.",
        "example": {
          "conditions": {
            "nl": "<p>Onze boekingsvoorwaarden.</p>"
          }
        }
      },
      "Bed": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 40,
            "enum": [
              "2pers_bed",
              "1pers_bed",
              "1pers_bank",
              "2pers_bank",
              "2pers_vouw",
              "1pers_vouw",
              "2pers_onderschuif",
              "1pers_onderschuif",
              "2pers_water",
              "1pers_water",
              "2pers_bedstee",
              "1pers_bedstee",
              "stapelbed",
              "twijfelaar",
              "kinderbed",
              "babybed",
              null
            ]
          },
          "number": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": -2147483648,
            "maximum": 2147483647
          }
        },
        "required": [
          "id",
          "type",
          "number"
        ],
        "additionalProperties": false,
        "example": {
          "id": 71,
          "type": "2pers_bed",
          "number": 1
        }
      },
      "RoomPatch": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "maxLength": 40,
            "minLength": 1,
            "enum": [
              "bedroom",
              "bathroom",
              "livingroom",
              "playroom",
              "studyroom",
              "tvroom",
              "diningroom",
              "generic_room",
              "kitchen",
              "balcony",
              "terrace",
              "courtyard",
              "roofterrace",
              "patio",
              "studio",
              "tuin"
            ]
          },
          "situation": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1,
            "enum": [
              "sous_terrain",
              "begane_grond",
              "1e_verdieping",
              "2e_verdieping",
              "3e_verdieping",
              "4e_verdieping",
              "5e_verdieping",
              "zolder",
              "dak",
              "attached",
              "elders"
            ]
          },
          "surface": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 2147483647
          },
          "name": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": "string",
              "maxLength": 255,
              "minLength": 1
            },
            "minProperties": 1,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          }
        },
        "required": [],
        "additionalProperties": false,
        "minProperties": 1,
        "description": "Wijzig de eigenschappen van de ruimte. De accommodatie, eigenaar, ID en bedden zijn niet wijzigbaar via deze route. surface is een niet-negatief geheel aantal m².",
        "example": {
          "name": {
            "nl": "Slaapkamer aan de tuin"
          },
          "surface": 20
        }
      },
      "Facility": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "name": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ],
              "maxLength": 80
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "count": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "comment": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "icon": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 80
          }
        },
        "required": [
          "id",
          "name",
          "count",
          "comment",
          "icon"
        ],
        "additionalProperties": false,
        "description": "Geselecteerde ObjectFeature-relaties met de bijbehorende Feature. id = Feature.id; count/comment komen uit ObjectFeature. Geen tweede faciliteitencatalogus.",
        "example": {
          "id": 12,
          "name": {
            "nl": "Wifi"
          },
          "count": null,
          "comment": null,
          "icon": "fas fa-wifi"
        }
      },
      "FacilityPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Facility"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 12,
              "name": {
                "nl": "Wifi"
              },
              "count": null,
              "comment": null,
              "icon": "fas fa-wifi"
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "PaymentConditions": {
        "type": "object",
        "properties": {
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "active": {
            "type": "boolean"
          },
          "cutoff": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "remaining_payment_send_days": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "percentage": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "payment_term": {
            "type": "integer",
            "minimum": -2147483648,
            "maximum": 2147483647
          },
          "reminder_interval": {
            "type": "integer",
            "minimum": 1,
            "maximum": 60
          },
          "automatic_mails": {
            "type": "string",
            "maxLength": 255,
            "enum": [
              "automatic",
              "owner"
            ]
          },
          "subject_to_vat": {
            "type": "boolean"
          },
          "vat": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 32767
          },
          "invoice_text": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 0,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          },
          "invoice_logo_url": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri",
            "readOnly": true
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch."
          }
        },
        "required": [
          "accommodation_id",
          "active",
          "cutoff",
          "remaining_payment_send_days",
          "percentage",
          "payment_term",
          "reminder_interval",
          "automatic_mails",
          "subject_to_vat",
          "vat",
          "invoice_text",
          "invoice_logo_url",
          "updated_at"
        ],
        "additionalProperties": false,
        "description": "Betalingsvoorwaarden van de accommodatie. invoice_logo_url is alleen-lezen; uploaden van een logo wordt niet aangeboden via deze route.",
        "example": {
          "accommodation_id": 123,
          "active": true,
          "cutoff": 42,
          "remaining_payment_send_days": 42,
          "percentage": 50,
          "payment_term": 0,
          "reminder_interval": 7,
          "automatic_mails": "automatic",
          "subject_to_vat": false,
          "vat": 0,
          "invoice_text": {
            "nl": "Dank voor je boeking."
          },
          "invoice_logo_url": null,
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "PaymentConditionsPatch": {
        "type": "object",
        "properties": {
          "active": {
            "type": "boolean"
          },
          "cutoff": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          },
          "remaining_payment_send_days": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          },
          "percentage": {
            "type": "integer",
            "minimum": 1,
            "maximum": 100
          },
          "payment_term": {
            "type": "integer",
            "minimum": 0,
            "maximum": 2147483647
          },
          "reminder_interval": {
            "type": "integer",
            "minimum": 1,
            "maximum": 60
          },
          "automatic_mails": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1,
            "enum": [
              "automatic",
              "owner"
            ]
          },
          "subject_to_vat": {
            "type": "boolean"
          },
          "vat": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 0,
            "maximum": 32767
          },
          "invoice_text": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 1,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          }
        },
        "required": [],
        "additionalProperties": false,
        "minProperties": 1,
        "description": "Wijzig betalingsvoorwaarden en factuurinstellingen. automatic_mails wijzigen vereist een actieve financiële module; anders volgt 409. percentage ligt tussen 1 en 100, reminder_interval tussen 1 en 60. Dagtermijnen zijn niet-negatief; remaining_payment_send_days mag cutoff niet overschrijden. subject_to_vat=true met vat=null wordt vat=0. De wijziging start geen betalingen, refunds of bulkmail en herberekent geen bestaande betaalverzoeken.",
        "example": {
          "percentage": 30,
          "cutoff": 42,
          "payment_term": 7
        }
      },
      "Review": {
        "type": "object",
        "properties": {
          "id": {
            "type": "integer",
            "minimum": 1
          },
          "accommodation_id": {
            "type": "integer",
            "minimum": 1
          },
          "visible": {
            "type": "boolean"
          },
          "date": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "name": {
            "type": "string",
            "maxLength": 255
          },
          "overall_stars": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 5
          },
          "text": {
            "type": [
              "string",
              "null"
            ]
          },
          "headline": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "surrounding_stars": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 5
          },
          "surrounding_review": {
            "type": [
              "string",
              "null"
            ]
          },
          "facilities_stars": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 5
          },
          "facilities_review": {
            "type": [
              "string",
              "null"
            ]
          },
          "landlord_stars": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 5
          },
          "landlord_review": {
            "type": [
              "string",
              "null"
            ]
          },
          "channel": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "created_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch."
          },
          "updated_at": {
            "type": "string",
            "format": "date-time",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9](\\.[0-9]{1,6})?Z$(?![\\s\\S])",
            "description": "UTC-timestamp YYYY-MM-DDTHH:MM:SS[.ffffff]Z; echte kalenderdatum. Geen lokale tijd of numerieke epoch."
          }
        },
        "required": [
          "id",
          "accommodation_id",
          "visible",
          "date",
          "name",
          "overall_stars",
          "text",
          "headline",
          "surrounding_stars",
          "surrounding_review",
          "facilities_stars",
          "facilities_review",
          "landlord_stars",
          "landlord_review",
          "channel",
          "created_at",
          "updated_at"
        ],
        "additionalProperties": false,
        "example": {
          "id": 501,
          "accommodation_id": 123,
          "visible": true,
          "date": "2026-09-20",
          "name": "Jamie Voorbeeld",
          "overall_stars": 5,
          "text": "Een fijn verblijf.",
          "headline": "Veel rust",
          "surrounding_stars": null,
          "surrounding_review": null,
          "facilities_stars": null,
          "facilities_review": null,
          "landlord_stars": null,
          "landlord_review": null,
          "channel": null,
          "created_at": "2026-09-29T10:00:00Z",
          "updated_at": "2026-09-29T10:00:00Z"
        }
      },
      "ReviewCreate": {
        "type": "object",
        "properties": {
          "visible": {
            "type": "boolean",
            "default": true
          },
          "date": {
            "type": "string",
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "name": {
            "type": "string",
            "maxLength": 255,
            "minLength": 1
          },
          "overall_stars": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 5
          },
          "text": {
            "type": "string",
            "minLength": 1
          },
          "headline": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "surrounding_stars": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 5
          },
          "surrounding_review": {
            "type": [
              "string",
              "null"
            ]
          },
          "facilities_stars": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 5
          },
          "facilities_review": {
            "type": [
              "string",
              "null"
            ]
          },
          "landlord_stars": {
            "type": [
              "integer",
              "null"
            ],
            "minimum": 1,
            "maximum": 5
          },
          "landlord_review": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "date",
          "name",
          "text"
        ],
        "additionalProperties": false,
        "description": "Voeg een handmatige review toe. date, name en text zijn verplicht. Sterren zijn optioneel: null of een geheel getal van 1 tot en met 5. visible is standaard true. De accommodatie volgt uit de URL; boeking en externe reviewbron zijn niet instelbaar.",
        "example": {
          "visible": true,
          "date": "2026-09-20",
          "name": "Jamie Voorbeeld",
          "overall_stars": 5,
          "text": "Een fijn verblijf."
        }
      },
      "ReviewPage": {
        "type": "object",
        "properties": {
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Review"
            }
          },
          "next": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          },
          "previous": {
            "type": [
              "string",
              "null"
            ],
            "format": "uri-reference"
          }
        },
        "required": [
          "results",
          "next",
          "previous"
        ],
        "additionalProperties": false,
        "example": {
          "results": [
            {
              "id": 501,
              "accommodation_id": 123,
              "visible": true,
              "date": "2026-09-20",
              "name": "Jamie Voorbeeld",
              "overall_stars": 5,
              "text": "Een fijn verblijf.",
              "headline": "Veel rust",
              "surrounding_stars": null,
              "surrounding_review": null,
              "facilities_stars": null,
              "facilities_review": null,
              "landlord_stars": null,
              "landlord_review": null,
              "channel": null,
              "created_at": "2026-09-29T10:00:00Z",
              "updated_at": "2026-09-29T10:00:00Z"
            }
          ],
          "next": null,
          "previous": null
        }
      },
      "ProfilePatch": {
        "type": "object",
        "properties": {
          "first_name": {
            "type": "string",
            "maxLength": 150,
            "minLength": 1
          },
          "last_name": {
            "type": "string",
            "maxLength": 150,
            "minLength": 1
          },
          "date_of_birth": {
            "type": [
              "string",
              "null"
            ],
            "format": "date",
            "pattern": "^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$(?![\\s\\S])",
            "description": "Exact YYYY-MM-DD; valide kalenderdatum. Geen tijd, timestamp of locale notatie.",
            "minLength": 10,
            "maxLength": 10
          },
          "gender": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 10,
            "enum": [
              "",
              "male",
              "female",
              "other",
              null
            ]
          },
          "street": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 255
          },
          "house_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "house_number_addition": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 100
          },
          "postal_code": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50
          },
          "city": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50
          },
          "country": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 75,
            "enum": [
              "AF",
              "AX",
              "AL",
              "DZ",
              "AS",
              "AD",
              "AO",
              "AI",
              "AQ",
              "AG",
              "AR",
              "AM",
              "AW",
              "AU",
              "AT",
              "AZ",
              "BS",
              "BH",
              "BD",
              "BB",
              "BY",
              "BE",
              "BZ",
              "BJ",
              "BM",
              "BT",
              "BO",
              "BQ",
              "BA",
              "BW",
              "BV",
              "BR",
              "IO",
              "BN",
              "BG",
              "BF",
              "BI",
              "KH",
              "CM",
              "CA",
              "CV",
              "KY",
              "CF",
              "TD",
              "CL",
              "CN",
              "CX",
              "CC",
              "CO",
              "KM",
              "CG",
              "CD",
              "CK",
              "CR",
              "CI",
              "HR",
              "CU",
              "CW",
              "CY",
              "CZ",
              "DK",
              "DJ",
              "DM",
              "DO",
              "EC",
              "EG",
              "SV",
              "GQ",
              "ER",
              "EE",
              "ET",
              "FK",
              "FO",
              "FJ",
              "FI",
              "FR",
              "GF",
              "PF",
              "TF",
              "GA",
              "GM",
              "GE",
              "DE",
              "GH",
              "GI",
              "GR",
              "GL",
              "GD",
              "GP",
              "GU",
              "GT",
              "GG",
              "GN",
              "GW",
              "GY",
              "HT",
              "HM",
              "VA",
              "HN",
              "HK",
              "HU",
              "IS",
              "IN",
              "ID",
              "IR",
              "IQ",
              "IE",
              "IM",
              "IL",
              "IT",
              "JM",
              "JP",
              "JE",
              "JO",
              "KZ",
              "KE",
              "KI",
              "KP",
              "KR",
              "KW",
              "KG",
              "LA",
              "LV",
              "LB",
              "LS",
              "LR",
              "LY",
              "LI",
              "LT",
              "LU",
              "MO",
              "MK",
              "MG",
              "MW",
              "MY",
              "MV",
              "ML",
              "MT",
              "MH",
              "MQ",
              "MR",
              "MU",
              "YT",
              "MX",
              "FM",
              "MD",
              "MC",
              "MN",
              "ME",
              "MS",
              "MA",
              "MZ",
              "MM",
              "NA",
              "NR",
              "NP",
              "NL",
              "NC",
              "NZ",
              "NI",
              "NE",
              "NG",
              "NU",
              "NF",
              "MP",
              "NO",
              "OM",
              "PK",
              "PW",
              "PS",
              "PA",
              "PG",
              "PY",
              "PE",
              "PH",
              "PN",
              "PL",
              "PT",
              "PR",
              "QA",
              "RO",
              "RU",
              "RW",
              "BL",
              "SH",
              "KN",
              "LC",
              "MF",
              "PM",
              "VC",
              "WS",
              "SM",
              "ST",
              "SA",
              "SN",
              "RS",
              "SC",
              "SL",
              "SG",
              "SX",
              "SK",
              "SI",
              "SB",
              "SO",
              "ZA",
              "GS",
              "SS",
              "ES",
              "LK",
              "SD",
              "SR",
              "SJ",
              "SZ",
              "SE",
              "CH",
              "SY",
              "TW",
              "TJ",
              "TZ",
              "TH",
              "TL",
              "TG",
              "TK",
              "TO",
              "TT",
              "TN",
              "TR",
              "TM",
              "TC",
              "TV",
              "UG",
              "UA",
              "AE",
              "GB",
              "US",
              "UM",
              "UY",
              "UZ",
              "VU",
              "VE",
              "VN",
              "VG",
              "VI",
              "WF",
              "EH",
              "YE",
              "ZM",
              "ZW",
              null
            ]
          },
          "language": {
            "type": "string",
            "maxLength": 5,
            "minLength": 1,
            "enum": [
              "nl",
              "en",
              "de",
              "es",
              "fr",
              "it",
              "pt",
              "el",
              "hu"
            ],
            "description": "Dashboardtaal: nl of en. Een bestaande andere ondersteunde taal mag ongewijzigd blijven."
          },
          "telephone": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 150
          },
          "landlord_type": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 75,
            "enum": [
              "private_person",
              "corporate",
              null
            ]
          },
          "company_name": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 150
          },
          "kvk_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50
          },
          "vat_number": {
            "type": [
              "string",
              "null"
            ],
            "maxLength": 50
          },
          "show_email": {
            "type": "boolean"
          },
          "show_telephone": {
            "type": "boolean"
          },
          "show_last_name": {
            "type": "boolean"
          },
          "about_me": {
            "type": "object",
            "propertyNames": {
              "enum": [
                "nl",
                "en",
                "de",
                "es",
                "fr",
                "it",
                "pt",
                "el",
                "hu"
              ]
            },
            "additionalProperties": {
              "type": [
                "string",
                "null"
              ]
            },
            "minProperties": 1,
            "description": "Taalcode → tekst; alleen ondersteunde/configureerde talen. PATCH voegt genoemde talen samen; overige talen blijven intact."
          }
        },
        "required": [],
        "additionalProperties": false,
        "minProperties": 1,
        "description": "Wijzig het profiel en de verhuurdersbeschrijving. date_of_birth is YYYY-MM-DD of null en mag niet in de toekomst liggen. first_name en last_name mogen niet leeg of null zijn. Landcode en taal moeten toegestaan zijn; about_me bevat vertalingen per toegestane taal. Alle wijzigingen worden samen opgeslagen. De ETag omvat het profiel en de verhuurdersbeschrijving.",
        "example": {
          "first_name": "Alex",
          "telephone": "+31612345678",
          "about_me": {
            "nl": "Welkom bij onze villa."
          }
        }
      }
    }
  },
  "x-tagGroups": [
    {
      "name": "Mijn Accommodatie",
      "tags": [
        "Mijn Accommodatie / Algemeen",
        "Mijn Accommodatie / Locatie",
        "Mijn Accommodatie / Teksten",
        "Mijn Accommodatie / Foto’s",
        "Mijn Accommodatie / Indeling",
        "Mijn Accommodatie / Faciliteiten",
        "Mijn Accommodatie / Huisregels",
        "Mijn Accommodatie / Voorwaarden",
        "Mijn Accommodatie / Betalingsvoorwaarden",
        "Mijn Accommodatie / Reviews"
      ]
    },
    {
      "name": "Boekingen & Prijzen",
      "tags": [
        "Boekingen & Prijzen / Boekingen",
        "Boekingen & Prijzen / Beschikbaarheid",
        "Boekingen & Prijzen / Tarieven"
      ]
    },
    {
      "name": "Gasten",
      "tags": [
        "Gasten / Overzicht"
      ]
    },
    {
      "name": "Inbox",
      "tags": [
        "Inbox / Berichten"
      ]
    },
    {
      "name": "Profiel verhuurder",
      "tags": [
        "Profiel verhuurder / Profiel"
      ]
    },
    {
      "name": "Account",
      "tags": [
        "Account / API Keys"
      ]
    },
    {
      "name": "Gebruikers",
      "tags": [
        "Gebruikers / Overzicht"
      ]
    },
    {
      "name": "Financieel",
      "tags": [
        "Financieel / Transacties"
      ]
    }
  ]
}
