{
  "openapi": "3.1.0",
  "info": {
    "title": "Resort Winterberg and Foxx Club Guest AI",
    "version": "1.1.0",
    "description": "Public facts, stateless request preparation and bounded read-only native hotel price preparation. No public guest-profile, durable-case, decision, booking, payment or private-order-status route."
  },
  "paths": {
    "/api/guest-ai/catalog": {
      "get": {
        "operationId": "getGuestAiCatalog",
        "summary": "Get verified public facts and capability limits",
        "responses": {
          "200": {
            "description": "Public JSON result. A preparation is never a saved case or booking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/guest-ai/schema": {
      "get": {
        "operationId": "getGuestAiRequestSchema",
        "summary": "Get request JSON Schema",
        "responses": {
          "200": {
            "description": "Public JSON result. A preparation is never a saved case or booking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/guest-ai/prepare": {
      "post": {
        "operationId": "prepareGuestAiRequest",
        "summary": "Validate a hotel, Foxx or combined request without sending or booking",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "title": "Guest AI preparation request",
                "description": "No names, emails, birth dates, payment data, credentials or free text. Ages in completed years on service date; 0 means under1. Missing fields are returned without inventing defaults.",
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "business"
                ],
                "properties": {
                  "business": {
                    "enum": [
                      "hotel",
                      "foxx",
                      "both"
                    ]
                  },
                  "language": {
                    "enum": [
                      "de",
                      "nl",
                      "en"
                    ]
                  },
                  "adults": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50
                  },
                  "childAges": {
                    "type": "array",
                    "maxItems": 49,
                    "items": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 17
                    }
                  },
                  "hotel": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "arrival": {
                        "type": "string",
                        "format": "date",
                        "pattern": "^20[0-9]{2}-[0-9]{2}-[0-9]{2}$"
                      },
                      "departure": {
                        "type": "string",
                        "format": "date",
                        "pattern": "^20[0-9]{2}-[0-9]{2}-[0-9]{2}$"
                      },
                      "rooms": {
                        "type": "integer",
                        "minimum": 1,
                        "maximum": 10
                      },
                      "meal": {
                        "enum": [
                          "room_only",
                          "breakfast",
                          "halfboard",
                          "no_preference"
                        ]
                      },
                      "dogs": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 10
                      },
                      "babyCots": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 10
                      },
                      "extraBeds": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 10
                      }
                    }
                  },
                  "foxx": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "visitDate": {
                        "type": "string",
                        "format": "date",
                        "pattern": "^20[0-9]{2}-[0-9]{2}-[0-9]{2}$"
                      },
                      "visitType": {
                        "enum": [
                          "ordinary",
                          "birthday",
                          "group"
                        ]
                      },
                      "visitorType": {
                        "enum": [
                          "day",
                          "resort"
                        ]
                      },
                      "ownedBands": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 99
                      },
                      "ownedSocks": {
                        "type": "integer",
                        "minimum": 0,
                        "maximum": 99
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Public JSON result. A preparation is never a saved case or booking.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid/unknown fields; no echoed values"
          },
          "403": {
            "description": "Unapproved browser origin"
          },
          "413": {
            "description": "Request exceeds8KiB"
          },
          "415": {
            "description": "Use application/json"
          }
        }
      }
    },
    "/api/guest-ai/hotel-prices": {
      "post": {
        "operationId": "readGuestAiHotelPrices",
        "summary": "Read a bounded, fresh public hotel price without guest profiles or booking",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$schema": "https://json-schema.org/draft/2020-12/schema",
                "title": "Guest AI preparation request",
                "description": "No names, emails, birth dates, payment data, credentials or free text. Ages in completed years on service date; 0 means under1. Missing fields are returned without inventing defaults.",
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "business",
                  "adults",
                  "childAges",
                  "hotel"
                ],
                "properties": {
                  "business": {
                    "const": "hotel"
                  },
                  "language": {
                    "enum": [
                      "de",
                      "nl",
                      "en"
                    ]
                  },
                  "adults": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 6
                  },
                  "childAges": {
                    "type": "array",
                    "maxItems": 5,
                    "items": {
                      "type": "integer",
                      "minimum": 0,
                      "maximum": 17
                    }
                  },
                  "hotel": {
                    "type": "object",
                    "additionalProperties": false,
                    "properties": {
                      "arrival": {
                        "type": "string",
                        "format": "date",
                        "pattern": "^20[0-9]{2}-[0-9]{2}-[0-9]{2}$"
                      },
                      "departure": {
                        "type": "string",
                        "format": "date",
                        "pattern": "^20[0-9]{2}-[0-9]{2}-[0-9]{2}$"
                      },
                      "rooms": {
                        "const": 1
                      },
                      "meal": {
                        "enum": [
                          "room_only",
                          "breakfast",
                          "halfboard",
                          "no_preference"
                        ]
                      }
                    },
                    "required": [
                      "arrival",
                      "departure",
                      "rooms"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Verified public hotel price preparation; expiry and tax/payment reconciliation limits included. Not a binding offer or booking."
          },
          "400": {
            "description": "Unsupported or incomplete single-room request, unknown/personal field, extras or out-of-scope party."
          },
          "403": {
            "description": "Foreign browser origin."
          },
          "405": {
            "description": "POST required."
          },
          "413": {
            "description": "Body exceeds8192bytes."
          },
          "415": {
            "description": "application/json required."
          },
          "422": {
            "description": "No verified public matching flexible-rate price."
          },
          "429": {
            "description": "Global native price-read budget exhausted; Retry-After provided."
          },
          "503": {
            "description": "Reader busy, TravelPartner priority window, master stop or native-source error; no fabricated price."
          }
        }
      }
    }
  },
  "x-deployment-status": "STAGED_NOT_PUBLICLY_VERIFIED"
}