{
  "openapi": "3.1.0",
  "info": {
    "title": "Overlook Hospitality API",
    "version": "1.0.0",
    "description": "Concierge recommendations for a hotel stay: send a hotel, stay dates, and guest details and get back nearby food and beverage venues, attractions, and events in one response."
  },
  "servers": [
    {
      "url": "https://api.overlookhospitality.com",
      "description": "Production"
    },
    {
      "url": "https://api-staging.overlookhospitality.com",
      "description": "Staging"
    }
  ],
  "tags": [
    {
      "name": "Concierge",
      "description": "Recommendations for a stay."
    },
    {
      "name": "Hotels",
      "description": "Hotel typeahead."
    },
    {
      "name": "Places",
      "description": "Rich place detail."
    },
    {
      "name": "Events",
      "description": "Rich event detail."
    },
    {
      "name": "Health",
      "description": "Liveness."
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/v1/health": {
      "get": {
        "operationId": "getHealth",
        "tags": [
          "Health"
        ],
        "summary": "Liveness and dependency status",
        "description": "Returns `{ ok: true }` while the service is healthy, or `{ ok: false, warnings: [...] }` when a periodic upstream probe has failed. Always answers `200`. Not authenticated and not rate limited.",
        "security": [],
        "responses": {
          "200": {
            "description": "Service is up.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HealthResponse"
                }
              }
            }
          }
        }
      }
    },
    "/v1/concierge": {
      "post": {
        "operationId": "createConcierge",
        "tags": [
          "Concierge"
        ],
        "summary": "Recommendations for a stay",
        "description": "Returns the resolved hotel plus up to three independently sized sections: food and beverage, attractions, and events.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConciergeRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "The concierge result set.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ConciergeResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "422": {
            "$ref": "#/components/responses/HotelNotResolved"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          },
          "504": {
            "$ref": "#/components/responses/UpstreamTimeout"
          }
        }
      }
    },
    "/v1/hotels/autocomplete": {
      "get": {
        "operationId": "autocompleteHotels",
        "tags": [
          "Hotels"
        ],
        "summary": "Hotel typeahead",
        "description": "Find a hotel and its `placeId` before calling `POST /v1/concierge`. At most 8 matches.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Free-text hotel search. Fewer than 2 characters returns an empty list without searching."
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked hotel matches.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/HotelAutocompleteResponse"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          }
        }
      }
    },
    "/v1/places/{placeId}": {
      "get": {
        "operationId": "getPlaceDetail",
        "tags": [
          "Places"
        ],
        "summary": "Rich detail for one place",
        "description": "One shape for every place — a food and beverage venue, an attraction, or a hotel.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "placeId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Overlook place id from a list item or the `hotel` object. Namespaced ids are normalized."
          },
          {
            "name": "hotelPlaceId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Reference hotel; when supplied, `distanceFromHotel` is computed in miles."
          }
        ],
        "responses": {
          "200": {
            "description": "The place detail.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PlaceDetailResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          },
          "504": {
            "$ref": "#/components/responses/UpstreamTimeout"
          }
        }
      }
    },
    "/v1/events/{eventId}": {
      "get": {
        "operationId": "getEventDetail",
        "tags": [
          "Events"
        ],
        "summary": "Rich detail for one event",
        "description": "Adds the full description, venue, showing times, and the ticket link the event list does not carry.",
        "security": [
          {
            "bearerAuth": []
          }
        ],
        "parameters": [
          {
            "name": "eventId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Event identifier from a list response."
          },
          {
            "name": "hotelPlaceId",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Reference hotel; when supplied, `distanceFromHotel` is computed in miles."
          }
        ],
        "responses": {
          "200": {
            "description": "The event detail.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/EventDetailResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "502": {
            "$ref": "#/components/responses/UpstreamUnavailable"
          },
          "504": {
            "$ref": "#/components/responses/UpstreamTimeout"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Overlook-issued bearer token."
      }
    },
    "schemas": {
      "Layer": {
        "type": "object",
        "properties": {
          "slug": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "shortName": {
            "type": "string"
          },
          "iconUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "slug",
          "name",
          "shortName",
          "iconUrl",
          "url"
        ],
        "description": "A curated recognition badge (Michelin, AAA, …)."
      },
      "Hotel": {
        "type": "object",
        "properties": {
          "placeId": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "label": {
            "type": [
              "string",
              "null"
            ]
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "locality": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "placeId",
          "name",
          "label",
          "address",
          "locality",
          "region",
          "latitude",
          "longitude"
        ],
        "description": "A lightweight hotel reference."
      },
      "Place": {
        "type": "object",
        "properties": {
          "placeId": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": "string"
          },
          "section": {
            "type": "string",
            "enum": [
              "foodAndBeverage",
              "attractions"
            ]
          },
          "blurb": {
            "type": "string"
          },
          "why": {
            "type": "string"
          },
          "reasons": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "imageUrls": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "layers": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "layerIcons": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Layer"
            }
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "aggregateRating": {
            "type": [
              "number",
              "null"
            ]
          },
          "reviewCount": {
            "type": [
              "number",
              "null"
            ]
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "locality": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "priceRange": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "$",
              "$$",
              "$$$",
              "$$$$",
              null
            ]
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "reservationUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "distanceFromHotel": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "placeId",
          "name",
          "section",
          "blurb",
          "why",
          "reasons",
          "imageUrls",
          "imageUrl",
          "layers",
          "layerIcons",
          "latitude",
          "longitude",
          "aggregateRating",
          "reviewCount",
          "address",
          "locality",
          "region",
          "priceRange",
          "website",
          "reservationUrl",
          "distanceFromHotel"
        ],
        "description": "A ranked food-and-beverage or attraction list item."
      },
      "Event": {
        "type": "object",
        "properties": {
          "eventId": {
            "type": [
              "string",
              "null"
            ]
          },
          "venuePlaceId": {
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          },
          "date": {
            "type": "string",
            "description": "Event date in the venue's local time."
          },
          "time": {
            "type": "string",
            "description": "Event start time in the venue's local time."
          },
          "venue": {
            "type": "string"
          },
          "blurb": {
            "type": "string"
          },
          "why": {
            "type": "string"
          },
          "reasons": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "locality": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "timezone": {
            "type": [
              "string",
              "null"
            ]
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "neighborhood": {
            "type": [
              "string",
              "null"
            ]
          },
          "category": {
            "type": "string",
            "enum": [
              "music",
              "theater",
              "film",
              "sports",
              "comedy",
              "tours",
              "art",
              "nightlife",
              "learn",
              "health-fitness",
              "wellbeing",
              "family-kids",
              "other"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "isFree": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "ticketPrice": {
            "$ref": "#/components/schemas/TicketPrice"
          },
          "distanceFromHotel": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "eventId",
          "venuePlaceId",
          "title",
          "date",
          "time",
          "venue",
          "blurb",
          "why",
          "reasons",
          "latitude",
          "longitude",
          "locality",
          "region",
          "timezone",
          "address",
          "neighborhood",
          "category",
          "url",
          "isFree",
          "ticketPrice",
          "distanceFromHotel"
        ],
        "description": "A ranked event list item."
      },
      "RatingBySource": {
        "type": "object",
        "properties": {
          "provider": {
            "type": [
              "string",
              "null"
            ]
          },
          "rating": {
            "type": [
              "number",
              "null"
            ]
          },
          "count": {
            "type": [
              "number",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "provider",
          "rating",
          "count",
          "url"
        ]
      },
      "TicketPrice": {
        "type": [
          "object",
          "null"
        ],
        "description": "Ticket price range in the source's currency, or `null` when the source states no amount. `min` and `max` are non-negative numbers (at least one present); `currency` is an upper-cased ISO-4217 code or `null`.",
        "properties": {
          "min": {
            "type": [
              "number",
              "null"
            ]
          },
          "max": {
            "type": [
              "number",
              "null"
            ]
          },
          "currency": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "min",
          "max",
          "currency"
        ],
        "additionalProperties": false
      },
      "MenuItem": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "description": {
            "type": [
              "string",
              "null"
            ]
          },
          "price": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "name",
          "description",
          "price"
        ]
      },
      "MenuSection": {
        "type": "object",
        "properties": {
          "title": {
            "type": "string"
          },
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MenuItem"
            }
          }
        },
        "required": [
          "title",
          "items"
        ]
      },
      "SimilarPlace": {
        "type": "object",
        "properties": {
          "placeId": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": [
              "string",
              "null"
            ]
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "section": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "placeId",
          "name",
          "imageUrl",
          "section"
        ]
      },
      "PlaceEventRef": {
        "type": "object",
        "properties": {
          "eventId": {
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          },
          "date": {
            "type": [
              "string",
              "null"
            ]
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "eventId",
          "title",
          "date",
          "url"
        ]
      },
      "OpenHours": {
        "type": [
          "object",
          "null"
        ],
        "description": "Opening hours in the place's local time. Each open day is an array of \"HH:MM-HH:MM\" intervals; a closed day is null.",
        "properties": {
          "sunday": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$"
            }
          },
          "monday": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$"
            }
          },
          "tuesday": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$"
            }
          },
          "wednesday": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$"
            }
          },
          "thursday": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$"
            }
          },
          "friday": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$"
            }
          },
          "saturday": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string",
              "pattern": "^\\d{2}:\\d{2}-\\d{2}:\\d{2}$"
            }
          }
        },
        "required": [
          "sunday",
          "monday",
          "tuesday",
          "wednesday",
          "thursday",
          "friday",
          "saturday"
        ],
        "additionalProperties": false
      },
      "PlaceDetail": {
        "type": "object",
        "properties": {
          "placeId": {
            "type": [
              "string",
              "null"
            ]
          },
          "name": {
            "type": "string"
          },
          "category": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "subCategories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "shortDescription": {
            "type": "string"
          },
          "longDescription": {
            "type": "string"
          },
          "foodDescription": {
            "type": "string"
          },
          "ambianceDescription": {
            "type": "string"
          },
          "storyDescription": {
            "type": "string"
          },
          "reviewSummary": {
            "type": "string"
          },
          "imageUrls": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "reservationUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "phone": {
            "type": [
              "string",
              "null"
            ]
          },
          "openHours": {
            "$ref": "#/components/schemas/OpenHours"
          },
          "timezone": {
            "type": [
              "string",
              "null"
            ]
          },
          "layers": {
            "type": [
              "array",
              "null"
            ],
            "items": {
              "type": "string"
            }
          },
          "recognition": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Layer"
            }
          },
          "aggregateRating": {
            "type": [
              "number",
              "null"
            ]
          },
          "reviewCount": {
            "type": [
              "number",
              "null"
            ]
          },
          "ratingsBySource": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/RatingBySource"
            }
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "locality": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "postalCode": {
            "type": [
              "string",
              "null"
            ]
          },
          "country": {
            "type": [
              "string",
              "null"
            ]
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "priceRange": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "$",
              "$$",
              "$$$",
              "$$$$",
              null
            ]
          },
          "neighborhoods": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "menu": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MenuSection"
            }
          },
          "similarPlaces": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SimilarPlace"
            }
          },
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PlaceEventRef"
            }
          },
          "distanceFromHotel": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "placeId",
          "name",
          "category",
          "subCategories",
          "tags",
          "shortDescription",
          "longDescription",
          "foodDescription",
          "ambianceDescription",
          "storyDescription",
          "reviewSummary",
          "imageUrls",
          "imageUrl",
          "website",
          "reservationUrl",
          "phone",
          "openHours",
          "timezone",
          "layers",
          "recognition",
          "aggregateRating",
          "reviewCount",
          "ratingsBySource",
          "address",
          "locality",
          "region",
          "postalCode",
          "country",
          "latitude",
          "longitude",
          "priceRange",
          "neighborhoods",
          "menu",
          "similarPlaces",
          "events",
          "distanceFromHotel"
        ]
      },
      "EventDetail": {
        "type": "object",
        "properties": {
          "eventId": {
            "type": [
              "string",
              "null"
            ]
          },
          "title": {
            "type": "string"
          },
          "date": {
            "type": "string",
            "description": "Event date in the venue's local time."
          },
          "time": {
            "type": "string",
            "description": "Event start time in the venue's local time."
          },
          "endTime": {
            "type": [
              "string",
              "null"
            ]
          },
          "isOngoing": {
            "type": "boolean"
          },
          "times": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "category": {
            "type": "string",
            "enum": [
              "music",
              "theater",
              "film",
              "sports",
              "comedy",
              "tours",
              "art",
              "nightlife",
              "learn",
              "health-fitness",
              "wellbeing",
              "family-kids",
              "other"
            ]
          },
          "subcategory": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "tags": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "venue": {
            "type": "string"
          },
          "venuePlaceId": {
            "type": [
              "string",
              "null"
            ]
          },
          "venueAddress": {
            "type": [
              "string",
              "null"
            ]
          },
          "locality": {
            "type": [
              "string",
              "null"
            ]
          },
          "region": {
            "type": [
              "string",
              "null"
            ]
          },
          "timezone": {
            "type": [
              "string",
              "null"
            ]
          },
          "neighborhood": {
            "type": [
              "string",
              "null"
            ]
          },
          "latitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "longitude": {
            "type": [
              "number",
              "null"
            ]
          },
          "blurb": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "imageUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "isFree": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "ticketPrice": {
            "$ref": "#/components/schemas/TicketPrice"
          },
          "url": {
            "type": [
              "string",
              "null"
            ]
          },
          "detailUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "ticketUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "calendarUrl": {
            "type": [
              "string",
              "null"
            ]
          },
          "source": {
            "type": [
              "string",
              "null"
            ]
          },
          "distanceFromHotel": {
            "type": [
              "number",
              "null"
            ]
          }
        },
        "required": [
          "eventId",
          "title",
          "date",
          "time",
          "endTime",
          "isOngoing",
          "times",
          "category",
          "subcategory",
          "tags",
          "venue",
          "venuePlaceId",
          "venueAddress",
          "locality",
          "region",
          "timezone",
          "neighborhood",
          "latitude",
          "longitude",
          "blurb",
          "description",
          "imageUrl",
          "isFree",
          "ticketPrice",
          "url",
          "detailUrl",
          "ticketUrl",
          "calendarUrl",
          "source",
          "distanceFromHotel"
        ]
      },
      "ResultsCounts": {
        "type": "object",
        "description": "Per-section result counts.",
        "additionalProperties": false,
        "properties": {
          "foodAndBeverage": {
            "type": "integer",
            "minimum": 0,
            "maximum": 5,
            "default": 3
          },
          "attractions": {
            "type": "integer",
            "minimum": 0,
            "maximum": 5,
            "default": 3
          },
          "events": {
            "type": "integer",
            "minimum": 0,
            "maximum": 5,
            "default": 3
          }
        }
      },
      "ConciergeRequest": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "checkinDate",
          "checkoutDate"
        ],
        "anyOf": [
          {
            "required": [
              "hotelPlaceId"
            ]
          },
          {
            "required": [
              "hotelName",
              "hotelCity",
              "hotelState"
            ]
          }
        ],
        "properties": {
          "hotelPlaceId": {
            "type": "string"
          },
          "hotelName": {
            "type": "string"
          },
          "hotelAddress": {
            "type": "string",
            "default": ""
          },
          "hotelCity": {
            "type": "string"
          },
          "hotelState": {
            "type": "string"
          },
          "checkinDate": {
            "type": "string",
            "format": "date"
          },
          "checkoutDate": {
            "type": "string",
            "format": "date"
          },
          "roomRate": {
            "type": "integer",
            "minimum": 0,
            "default": 0
          },
          "adults": {
            "type": "integer",
            "minimum": 1,
            "default": 1
          },
          "children": {
            "type": "integer",
            "minimum": 0,
            "default": 0
          },
          "accessibleRoom": {
            "type": "string",
            "default": "no"
          },
          "loyaltyProgram": {
            "type": "string",
            "default": "no"
          },
          "guestZip": {
            "type": "string",
            "default": ""
          },
          "packageName": {
            "type": "string",
            "default": ""
          },
          "specialNotes": {
            "type": "string",
            "default": ""
          },
          "externalGuestId": {
            "type": "string",
            "description": "Opaque, caller-owned identifier for the guest. Echoed back unchanged; to be used for cross-booking personalization."
          },
          "resultsCounts": {
            "$ref": "#/components/schemas/ResultsCounts"
          },
          "radiusMiles": {
            "type": "number",
            "minimum": 5,
            "maximum": 30,
            "default": 15
          }
        }
      },
      "HealthResponse": {
        "type": "object",
        "required": [
          "ok"
        ],
        "properties": {
          "ok": {
            "type": "boolean",
            "description": "`false` once any dependency probe has errored, `true` otherwise. HTTP status remains `200` either way."
          },
          "warnings": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Present only when a dependency probe has failed; each entry is a human-readable capability name plus \"is unhealthy\"."
          }
        }
      },
      "ConciergeResponse": {
        "type": "object",
        "properties": {
          "requestId": {
            "type": "string"
          },
          "externalGuestId": {
            "type": [
              "string",
              "null"
            ]
          },
          "generatedAt": {
            "type": "string"
          },
          "durationMs": {
            "type": "integer"
          },
          "hotel": {
            "$ref": "#/components/schemas/Hotel"
          },
          "foodAndBeverage": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Place"
            }
          },
          "attractions": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Place"
            }
          },
          "events": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Event"
            }
          }
        },
        "required": [
          "requestId",
          "externalGuestId",
          "generatedAt",
          "durationMs",
          "hotel",
          "foodAndBeverage",
          "attractions",
          "events"
        ]
      },
      "HotelAutocompleteResponse": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Hotel"
            }
          }
        },
        "required": [
          "query",
          "results"
        ]
      },
      "PlaceDetailResponse": {
        "type": "object",
        "properties": {
          "place": {
            "$ref": "#/components/schemas/PlaceDetail"
          }
        },
        "required": [
          "place"
        ]
      },
      "EventDetailResponse": {
        "type": "object",
        "properties": {
          "event": {
            "$ref": "#/components/schemas/EventDetail"
          }
        },
        "required": [
          "event"
        ]
      },
      "Error": {
        "type": "object",
        "required": [
          "code",
          "message"
        ],
        "properties": {
          "code": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "details": {
            "type": "object"
          }
        }
      },
      "ErrorEnvelope": {
        "type": "object",
        "properties": {
          "error": {
            "$ref": "#/components/schemas/Error"
          }
        },
        "required": [
          "error"
        ]
      }
    },
    "responses": {
      "BadRequest": {
        "description": "The request was rejected (`invalid_request`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "Unauthorized": {
        "description": "Missing, malformed, or incorrect bearer token (`unauthorized`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "NotFound": {
        "description": "No such route or resource (`not_found`, `place_not_found`, or `event_not_found`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "RateLimited": {
        "description": "The sandbox key exceeded its quota (`rate_limited`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "InternalError": {
        "description": "Unexpected server failure (`internal_error`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "UpstreamUnavailable": {
        "description": "An upstream dependency failed (`upstream_unavailable`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "UpstreamTimeout": {
        "description": "A dependency timed out (`upstream_timeout` / `request_timeout`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "HotelNotResolved": {
        "description": "No confident hotel match (`hotel_not_resolved`).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      }
    }
  }
}
