Skip to main content
Glama

Search hotels

search_hotels
Read-onlyIdempotent

Find hotels by destination and/or text, with an indicative per-room-night price when a stay is given. destination is a place_name with its countryCode, a place or locality by placeId from an earlier answer, a point, or a country. text matches hotel names, brands and areas word for word. Indicative prices are estimates and not bookable: get_hotel_offers returns what the user pays. A name several places bear answers destination_ambiguous, and a search too broad to answer search_too_broad with its localities; each error says what to do next. The answer states the scope, the counts and notes; a next page is the cursor and, optionally, limit.

Tool call template

This tool declares no required parameters. Add optional parameters from the input schema as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "search_hotels"
  }
}

Input Schema

NameRequiredDescriptionDefault
sortNoResult order. `distance` needs a destination, `relevance` needs `text`, `price_asc` and `price_desc` need indicative pricing. Default: relevance with `text`, otherwise distance.
stayNoDates and party. Needed for indicative prices. Search uses only the dates when the rooms differ.
textNoHotel name, brand or area to match, 1 to 128 characters. A first page needs this or `destination`.
limitNoHotels per page, 1 to 50. Default 20.
cursorNo`nextCursor` from the previous response. A next page is the cursor and, optionally, `limit`; nothing else.
localeNoLanguage for names and text in the response: en or zh.
filtersNoFilters every hotel in the answer must pass.
pricingNo`indicative` adds an indicative price per hotel and needs a stay; `none` skips prices. Default: indicative with a stay, otherwise none.
currencyNoThe currency of every price: USD (default) or CNY. Each currency is paid through its own channel, with its own payment methods; the order's payment page shows them. CNY is paid through payment channels in mainland China and suits a user who pays that way.
destinationNoWhere to search. A first page needs this or `text`.

Output Schema

NameRequiredDescriptionDefault
dataYes
sortYes
stayYes
textYes
notesYes
pricingYes
coverageYesWhat the search covered: counts of hotels, each null when it doesn't apply.
nextCursorYesPass it back as cursor for the next page; null on the last page.
destinationYes
currencyHintNoPresent only when the search is not in that currency and the user may pay through its channel: this request comes from mainland China (request_location), or the user's latest sign-in to Fortrip was there (sign_in_location). Prices are also available in that currency; a suggestion, not a requirement.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / currency / description
      Previous value: -"The currency to price and charge in: USD (default) or CNY, where available (otherwise the answer is currency_unavailable). Use CNY only for a user who pays with Alipay, WeChat Pay or a bank card from mainland China, the only ways a CNY order can be paid: when they ask for CNY or say they pay that way. Ask only when the conversation suggests it; otherwise keep USD."New value: +"The currency of every price: USD (default) or CNY. Each currency is paid through its own channel, with its own payment methods; the order's payment page shows them. CNY is paid through payment channels in mainland China and suits a user who pays that way."
    • changedInput schema / properties / pricing / description
      Previous value: -"`indicative` adds an approximate price per hotel and needs a stay; `none` skips prices. Default: indicative with a stay, otherwise none."New value: +"`indicative` adds an indicative price per hotel and needs a stay; `none` skips prices. Default: indicative with a stay, otherwise none."
    • addedOutput schema / properties / currencyHint
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present only when the search is not in that currency and the user may pay through its channel: this request comes from mainland China (request_location), or the user's latest sign-in to Fortrip was there (sign_in_location). Prices are also available in that currency; a suggestion, not a requirement.",
      +  "properties": {
      +    "currency": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "CNY"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "reason": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "request_location",
      +            "sign_in_location"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    }
      +  },
      +  "required": [
      +    "currency",
      +    "reason"
      +  ],
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • changedInput schema / properties / currency / description
      Previous value: -"The currency to price and charge in: USD (default) or CNY, where available (otherwise the answer is currency_unavailable)."New value: +"The currency to price and charge in: USD (default) or CNY, where available (otherwise the answer is currency_unavailable). Use CNY only for a user who pays with Alipay, WeChat Pay or a bank card from mainland China, the only ways a CNY order can be paid: when they ask for CNY or say they pay that way. Ask only when the conversation suggests it; otherwise keep USD."
  3. Changed19 schema fields changed
    • addedInput schema / properties / currency
      Added value: +{
      +  "description": "The currency to price and charge in: USD (default) or CNY, where available (otherwise the answer is currency_unavailable).",
      +  "enum": [
      +    "USD",
      +    "CNY"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / destination / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "countryCode": {
      -        "description": "ISO 3166-1 alpha-2 country the place is in, e.g. JP.",
      -        "pattern": "^[A-Z]{2}$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "place_name",
      -        "description": "A place named in words, with its country.",
      -        "type": "string"
      -      },
      -      "name": {
      -        "description": "The place name, in any language, e.g. Tokyo or 东京.",
      -        "maxLength": 128,
      -        "minLength": 1,
      -        "type": "string"
      -      },
      -      "radiusMeters": {
      -        "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      -        "maximum": 80000,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "name",
      -      "countryCode"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "place",
      -        "description": "A place id from an earlier response.",
      -        "type": "string"
      -      },
      -      "placeId": {
      -        "description": "placeId from an earlier response.",
      -        "pattern": "^plc_\\d{1,12}$",
      -        "type": "string"
      -      },
      -      "radiusMeters": {
      -        "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      -        "maximum": 80000,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "placeId"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "point",
      -        "description": "A point on the map.",
      -        "type": "string"
      -      },
      -      "location": {
      -        "additionalProperties": false,
      -        "description": "The point, WGS84.",
      -        "properties": {
      -          "lat": {
      -            "description": "Latitude, WGS84.",
      -            "maximum": 90,
      -            "minimum": -90,
      -            "type": "number"
      -          },
      -          "lng": {
      -            "description": "Longitude, WGS84.",
      -            "maximum": 180,
      -            "minimum": -180,
      -            "type": "number"
      -          }
      -        },
      -        "required": [
      -          "lat",
      -          "lng"
      -        ],
      -        "type": "object"
      -      },
      -      "radiusMeters": {
      -        "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      -        "maximum": 80000,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "location"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "countryCode": {
      -        "description": "ISO 3166-1 alpha-2 country, e.g. JP.",
      -        "pattern": "^[A-Z]{2}$",
      -        "type": "string"
      -      },
      -      "kind": {
      -        "const": "country",
      -        "description": "A whole country.",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "countryCode"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "kind": {
      -        "const": "locality",
      -        "description": "A locality (hub) listed in an earlier search response.",
      -        "type": "string"
      -      },
      -      "placeId": {
      -        "description": "placeId of the locality.",
      -        "pattern": "^plc_\\d{1,12}$",
      -        "type": "string"
      -      },
      -      "radiusMeters": {
      -        "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      -        "maximum": 80000,
      -        "minimum": 1,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "placeId"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "countryCode": {
      +        "description": "ISO 3166-1 alpha-2 country the place is in, e.g. JP.",
      +        "pattern": "^[A-Z]{2}$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "place_name",
      +        "description": "A place named in words, with its country.",
      +        "type": "string"
      +      },
      +      "name": {
      +        "description": "The place name, in any language, e.g. Tokyo or 东京.",
      +        "maxLength": 128,
      +        "minLength": 1,
      +        "type": "string"
      +      },
      +      "radiusMeters": {
      +        "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      +        "maximum": 80000,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "name",
      +      "countryCode"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "place",
      +        "description": "A place id from an earlier response.",
      +        "type": "string"
      +      },
      +      "placeId": {
      +        "description": "placeId from an earlier response.",
      +        "pattern": "^plc_\\d{1,12}$",
      +        "type": "string"
      +      },
      +      "radiusMeters": {
      +        "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      +        "maximum": 80000,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "placeId"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "point",
      +        "description": "A point on the map.",
      +        "type": "string"
      +      },
      +      "location": {
      +        "additionalProperties": false,
      +        "description": "The point, WGS84.",
      +        "properties": {
      +          "lat": {
      +            "description": "Latitude, WGS84.",
      +            "maximum": 90,
      +            "minimum": -90,
      +            "type": "number"
      +          },
      +          "lng": {
      +            "description": "Longitude, WGS84.",
      +            "maximum": 180,
      +            "minimum": -180,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "lat",
      +          "lng"
      +        ],
      +        "type": "object"
      +      },
      +      "radiusMeters": {
      +        "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      +        "maximum": 80000,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "location"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "countryCode": {
      +        "description": "ISO 3166-1 alpha-2 country, e.g. JP.",
      +        "pattern": "^[A-Z]{2}$",
      +        "type": "string"
      +      },
      +      "kind": {
      +        "const": "country",
      +        "description": "A whole country.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "countryCode"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "kind": {
      +        "const": "locality",
      +        "description": "A locality listed in an earlier search response.",
      +        "type": "string"
      +      },
      +      "placeId": {
      +        "description": "placeId of the locality.",
      +        "pattern": "^plc_\\d{1,12}$",
      +        "type": "string"
      +      },
      +      "radiusMeters": {
      +        "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      +        "maximum": 80000,
      +        "minimum": 1,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "placeId"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / displayCurrency
      Removed value: -{
      -  "description": "Currency to show prices in, USD or CNY. It never changes what is charged: payment is in USD.",
      -  "enum": [
      -    "USD",
      -    "CNY"
      -  ],
      -  "type": "string"
      -}
    • changedInput schema / properties / filters / properties / price / properties / maxPerRoomNight / description
      Previous value: -"Highest price per room per night, in USD."New value: +"Highest price per room per night, in the search's currency."
    • removedInput schema / properties / filters / properties / price / properties / maxPerRoomNight / properties / currency / const
      Removed value: -"USD"
    • changedInput schema / properties / filters / properties / price / properties / maxPerRoomNight / properties / currency / description
      Previous value: -"Always USD in a request."New value: +"USD or CNY."
    • addedInput schema / properties / filters / properties / price / properties / maxPerRoomNight / properties / currency / enum
      Added value: +[
      +  "USD",
      +  "CNY"
      +]
    • addedOutput schema / properties / coverage / description
      Added value: +"What the search covered: counts of hotels, each null when it doesn't apply."
    • addedOutput schema / properties / coverage / properties / excludedNoFacilityData / description
      Added value: +"With an amenity filter: hotels left out for listing no facilities at all, though they may have the amenity; otherwise null."
    • addedOutput schema / properties / coverage / properties / excludedNoPrice / description
      Added value: +"With a price filter: priced hotels left out for having no indicative price; otherwise null."
    • addedOutput schema / properties / coverage / properties / localities / description
      Added value: +"For an area: its top localities, the towns its matching hotels belong to; otherwise null."
    • addedOutput schema / properties / coverage / properties / matched / description
      Added value: +"Hotels that match the destination, the text and every filter but the price filter."
    • addedOutput schema / properties / coverage / properties / nameAsText / description
      Added value: +"When a place_name search matched few hotels: how many in its country match the name as text; otherwise null."
    • addedOutput schema / properties / coverage / properties / poolRadiusMeters / description
      Added value: +"When a price sort or price filter priced only the nearest 3,000: how far the farthest of them is from the center, in meters; otherwise null."
    • addedOutput schema / properties / coverage / properties / priced / description
      Added value: +"Hotels priced: those on this page, or with a price sort or price filter the whole priced set (pricing.scope); null without prices."
    • addedOutput schema / properties / coverage / properties / textAnywhere / description
      Added value: +"With text and a place: the hotels that match the text anywhere in the place's country; otherwise null."
    • addedOutput schema / properties / coverage / properties / withPrice / description
      Added value: +"Of those priced, how many have an indicative price; null when prices weren't asked for or are unavailable."
    • addedOutput schema / properties / coverage / properties / withinMaxRadius / description
      Added value: +"For a radius under 80,000 m: how many would match within 80,000 m of the center; otherwise null."
    • changedOutput schema / properties / data / items / properties / price / anyOf
      Previous value: -[
      -  {
      -    "additionalProperties": {},
      -    "properties": {
      -      "approx": {
      -        "anyOf": [
      -          {
      -            "additionalProperties": {},
      -            "properties": {
      -              "fromPerRoomNight": {
      -                "additionalProperties": {},
      -                "properties": {
      -                  "amount": {
      -                    "pattern": "^\\d+(\\.\\d+)?$",
      -                    "type": "string"
      -                  },
      -                  "currency": {
      -                    "pattern": "^[A-Z]{3}$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "amount",
      -                  "currency"
      -                ],
      -                "type": "object"
      -              },
      -              "fromPerRoomStay": {
      -                "additionalProperties": {},
      -                "properties": {
      -                  "amount": {
      -                    "pattern": "^\\d+(\\.\\d+)?$",
      -                    "type": "string"
      -                  },
      -                  "currency": {
      -                    "pattern": "^[A-Z]{3}$",
      -                    "type": "string"
      -                  }
      -                },
      -                "required": [
      -                  "amount",
      -                  "currency"
      -                ],
      -                "type": "object"
      -              },
      -              "rateDate": {
      -                "type": "string"
      -              }
      -            },
      -            "required": [
      -              "fromPerRoomNight",
      -              "fromPerRoomStay",
      -              "rateDate"
      -            ],
      -            "type": "object"
      -          },
      -          {
      -            "type": "null"
      -          }
      -        ]
      -      },
      -      "basis": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "lowest_unit"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "type": "string"
      -          }
      -        ]
      -      },
      -      "fromPerRoomNight": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "amount": {
      -            "pattern": "^\\d+(\\.\\d+)?$",
      -            "type": "string"
      -          },
      -          "currency": {
      -            "pattern": "^[A-Z]{3}$",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "amount",
      -          "currency"
      -        ],
      -        "type": "object"
      -      },
      -      "fromPerRoomStay": {
      -        "additionalProperties": {},
      -        "properties": {
      -          "amount": {
      -            "pattern": "^\\d+(\\.\\d+)?$",
      -            "type": "string"
      -          },
      -          "currency": {
      -            "pattern": "^[A-Z]{3}$",
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "amount",
      -          "currency"
      -        ],
      -        "type": "object"
      -      },
      -      "kind": {
      -        "anyOf": [
      -          {
      -            "enum": [
      -              "indicative"
      -            ],
      -            "type": "string"
      -          },
      -          {
      -            "type": "string"
      -          }
      -        ]
      -      }
      -    },
      -    "required": [
      -      "kind",
      -      "basis",
      -      "fromPerRoomNight",
      -      "fromPerRoomStay",
      -      "approx"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": {},
      +    "properties": {
      +      "basis": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "lowest_unit"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "string"
      +          }
      +        ]
      +      },
      +      "fromPerRoomNight": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "amount": {
      +            "pattern": "^\\d+(\\.\\d+)?$",
      +            "type": "string"
      +          },
      +          "currency": {
      +            "pattern": "^[A-Z]{3}$",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "amount",
      +          "currency"
      +        ],
      +        "type": "object"
      +      },
      +      "fromPerRoomStay": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "amount": {
      +            "pattern": "^\\d+(\\.\\d+)?$",
      +            "type": "string"
      +          },
      +          "currency": {
      +            "pattern": "^[A-Z]{3}$",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "amount",
      +          "currency"
      +        ],
      +        "type": "object"
      +      },
      +      "kind": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "indicative"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "string"
      +          }
      +        ]
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "basis",
      +      "fromPerRoomNight",
      +      "fromPerRoomStay"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
  4. Changed4 schema fields changed
    • changedInput schema / properties / stay / properties / checkOut / description
      Previous value: -"Check-out date in the hotel's calendar, yyyy-MM-dd. Stays are 1 to 30 nights."New value: +"Check-out date in the hotel's calendar, yyyy-MM-dd. Stays are 1 to 15 nights; a longer one answers stay_unsupported (max_nights), and past 30 nights invalid_request: ask the user whether to split it into consecutive stays."
    • changedInput schema / properties / stay / properties / rooms / description
      Previous value: -"The rooms wanted, 1 to 8, each with its own party."New value: +"The rooms wanted, 1 to 8, each with its party; offers and orders need every room the same."
    • addedOutput schema / properties / data / items / properties / photo / description
      Added value: +"The cover photo; null when there is none."
    • addedOutput schema / properties / nextCursor / description
      Added value: +"Pass it back as cursor for the next page; null on the last page."
  5. Changed1 schema field changed
    • changedOutput schema / properties / data / items / required
      Previous value: -[
      -  "hotelId",
      -  "name",
      -  "names",
      -  "stars",
      -  "address",
      -  "location",
      -  "timeZone",
      -  "distanceMeters",
      -  "price"
      -]New value: +[
      +  "hotelId",
      +  "name",
      +  "names",
      +  "stars",
      +  "address",
      +  "location",
      +  "timeZone",
      +  "distanceMeters",
      +  "price",
      +  "photo"
      +]
  6. Changed26 schema fields changed
    • removedInput schema / properties / checkIn
      Removed value: -{
      -  "description": "Check-in date, yyyy-MM-dd.",
      -  "type": "string"
      -}
    • removedInput schema / properties / checkOut
      Removed value: -{
      -  "description": "Check-out date, yyyy-MM-dd. Stays are 1 to 15 nights.",
      -  "type": "string"
      -}
    • removedInput schema / properties / cityCode
      Removed value: -{
      -  "description": "Catalogue city code, as returned in `hotels[].cityCode`.",
      -  "exclusiveMinimum": 0,
      -  "maximum": 9007199254740991,
      -  "type": "integer"
      -}
    • removedInput schema / properties / currency
      Removed value: -{
      -  "default": "CNY",
      -  "description": "Currency to show prices in. Prices are converted from the supplier's at Stripe's exchange rate; the response's `fx` says how.",
      -  "enum": [
      -    "CNY",
      -    "USD"
      -  ],
      -  "type": "string"
      -}
    • addedInput schema / properties / cursor
      Added value: +{
      +  "description": "`nextCursor` from the previous response. A next page is the cursor and, optionally, `limit`; nothing else.",
      +  "minLength": 1,
      +  "type": "string"
      +}
    • addedInput schema / properties / destination
      Added value: +{
      +  "description": "Where to search. A first page needs this or `text`.",
      +  "oneOf": [
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "countryCode": {
      +          "description": "ISO 3166-1 alpha-2 country the place is in, e.g. JP.",
      +          "pattern": "^[A-Z]{2}$",
      +          "type": "string"
      +        },
      +        "kind": {
      +          "const": "place_name",
      +          "description": "A place named in words, with its country.",
      +          "type": "string"
      +        },
      +        "name": {
      +          "description": "The place name, in any language, e.g. Tokyo or 东京.",
      +          "maxLength": 128,
      +          "minLength": 1,
      +          "type": "string"
      +        },
      +        "radiusMeters": {
      +          "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      +          "maximum": 80000,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "name",
      +        "countryCode"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "kind": {
      +          "const": "place",
      +          "description": "A place id from an earlier response.",
      +          "type": "string"
      +        },
      +        "placeId": {
      +          "description": "placeId from an earlier response.",
      +          "pattern": "^plc_\\d{1,12}$",
      +          "type": "string"
      +        },
      +        "radiusMeters": {
      +          "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      +          "maximum": 80000,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "placeId"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "kind": {
      +          "const": "point",
      +          "description": "A point on the map.",
      +          "type": "string"
      +        },
      +        "location": {
      +          "additionalProperties": false,
      +          "description": "The point, WGS84.",
      +          "properties": {
      +            "lat": {
      +              "description": "Latitude, WGS84.",
      +              "maximum": 90,
      +              "minimum": -90,
      +              "type": "number"
      +            },
      +            "lng": {
      +              "description": "Longitude, WGS84.",
      +              "maximum": 180,
      +              "minimum": -180,
      +              "type": "number"
      +            }
      +          },
      +          "required": [
      +            "lat",
      +            "lng"
      +          ],
      +          "type": "object"
      +        },
      +        "radiusMeters": {
      +          "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      +          "maximum": 80000,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "location"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "countryCode": {
      +          "description": "ISO 3166-1 alpha-2 country, e.g. JP.",
      +          "pattern": "^[A-Z]{2}$",
      +          "type": "string"
      +        },
      +        "kind": {
      +          "const": "country",
      +          "description": "A whole country.",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "countryCode"
      +      ],
      +      "type": "object"
      +    },
      +    {
      +      "additionalProperties": false,
      +      "properties": {
      +        "kind": {
      +          "const": "locality",
      +          "description": "A locality (hub) listed in an earlier search response.",
      +          "type": "string"
      +        },
      +        "placeId": {
      +          "description": "placeId of the locality.",
      +          "pattern": "^plc_\\d{1,12}$",
      +          "type": "string"
      +        },
      +        "radiusMeters": {
      +          "description": "Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.",
      +          "maximum": 80000,
      +          "minimum": 1,
      +          "type": "integer"
      +        }
      +      },
      +      "required": [
      +        "kind",
      +        "placeId"
      +      ],
      +      "type": "object"
      +    }
      +  ]
      +}
    • addedInput schema / properties / displayCurrency
      Added value: +{
      +  "description": "Currency to show prices in, USD or CNY. It never changes what is charged: payment is in USD.",
      +  "enum": [
      +    "USD",
      +    "CNY"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / facilities
      Removed value: -{
      -  "description": "Facilities every hotel must have. Names must match the catalogue exactly (case-insensitive), e.g. `Swimming pool`, `Parking`.",
      -  "items": {
      -    "maxLength": 64,
      -    "minLength": 1,
      -    "type": "string"
      -  },
      -  "maxItems": 10,
      -  "minItems": 1,
      -  "type": "array"
      -}
    • addedInput schema / properties / filters
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Filters every hotel in the answer must pass.",
      +  "properties": {
      +    "amenities": {
      +      "description": "Amenities every hotel must list. Only some codes can filter; asking for one that cannot is answered with the list that can.",
      +      "items": {
      +        "enum": [
      +          "parking",
      +          "wifi",
      +          "laundry",
      +          "restaurant",
      +          "room_service",
      +          "bar",
      +          "non_smoking",
      +          "business_center",
      +          "pool",
      +          "airport_shuttle",
      +          "spa",
      +          "gym",
      +          "accessible",
      +          "ev_charging",
      +          "air_conditioning",
      +          "pets_allowed",
      +          "kitchen",
      +          "other"
      +        ],
      +        "type": "string"
      +      },
      +      "maxItems": 9,
      +      "minItems": 1,
      +      "type": "array"
      +    },
      +    "price": {
      +      "additionalProperties": false,
      +      "description": "Price limit. Needs indicative pricing, so a stay.",
      +      "properties": {
      +        "maxPerRoomNight": {
      +          "additionalProperties": false,
      +          "description": "Highest price per room per night, in USD.",
      +          "properties": {
      +            "amount": {
      +              "description": "Decimal string such as 132.40, never a number.",
      +              "pattern": "^\\d+(\\.\\d+)?$",
      +              "type": "string"
      +            },
      +            "currency": {
      +              "const": "USD",
      +              "description": "Always USD in a request.",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "amount",
      +            "currency"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "maxPerRoomNight"
      +      ],
      +      "type": "object"
      +    },
      +    "stars": {
      +      "additionalProperties": false,
      +      "description": "Star rating range. Unrated hotels are left out whenever it is set.",
      +      "properties": {
      +        "max": {
      +          "description": "Highest star rating, 1 to 5 in steps of 0.5.",
      +          "maximum": 5,
      +          "minimum": 1,
      +          "type": "number"
      +        },
      +        "min": {
      +          "description": "Lowest star rating, 1 to 5 in steps of 0.5.",
      +          "maximum": 5,
      +          "minimum": 1,
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "Hotels per page, 1 to 50. Default 20.",
      +  "maximum": 50,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedInput schema / properties / locale
      Added value: +{
      +  "description": "Language for names and text in the response: en or zh.",
      +  "enum": [
      +    "en",
      +    "zh"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / near
      Removed value: -{
      -  "additionalProperties": false,
      -  "description": "Search around a point.",
      -  "properties": {
      -    "lat": {
      -      "description": "Latitude.",
      -      "maximum": 90,
      -      "minimum": -90,
      -      "type": "number"
      -    },
      -    "lng": {
      -      "description": "Longitude.",
      -      "maximum": 180,
      -      "minimum": -180,
      -      "type": "number"
      -    },
      -    "radiusKm": {
      -      "description": "Radius in kilometres.",
      -      "exclusiveMinimum": 0,
      -      "maximum": 200,
      -      "type": "number"
      -    }
      -  },
      -  "required": [
      -    "lat",
      -    "lng",
      -    "radiusKm"
      -  ],
      -  "type": "object"
      -}
    • removedInput schema / properties / page
      Removed value: -{
      -  "default": 1,
      -  "description": "Page number.",
      -  "maximum": 100,
      -  "minimum": 1,
      -  "type": "integer"
      -}
    • removedInput schema / properties / pageSize
      Removed value: -{
      -  "default": 20,
      -  "description": "Hotels per page.",
      -  "maximum": 50,
      -  "minimum": 1,
      -  "type": "integer"
      -}
    • removedInput schema / properties / priceMax
      Removed value: -{
      -  "description": "Highest average nightly price, in `currency`.",
      -  "exclusiveMinimum": 0,
      -  "type": "number"
      -}
    • removedInput schema / properties / priceMin
      Removed value: -{
      -  "description": "Lowest average nightly price, in `currency`. Applied to indicative prices.",
      -  "minimum": 0,
      -  "type": "number"
      -}
    • addedInput schema / properties / pricing
      Added value: +{
      +  "description": "`indicative` adds an approximate price per hotel and needs a stay; `none` skips prices. Default: indicative with a stay, otherwise none.",
      +  "enum": [
      +    "indicative",
      +    "none"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / query
      Removed value: -{
      -  "description": "Hotel name, brand or city to search for. Provide at least one of `query`, `cityCode` or `near`.",
      -  "maxLength": 128,
      -  "minLength": 1,
      -  "type": "string"
      -}
    • addedInput schema / properties / sort
      Added value: +{
      +  "description": "Result order. `distance` needs a destination, `relevance` needs `text`, `price_asc` and `price_desc` need indicative pricing. Default: relevance with `text`, otherwise distance.",
      +  "enum": [
      +    "distance",
      +    "relevance",
      +    "stars_desc",
      +    "price_asc",
      +    "price_desc"
      +  ],
      +  "type": "string"
      +}
    • removedInput schema / properties / sortBy
      Removed value: -{
      -  "default": "recommended",
      -  "description": "Result order. `recommended` sorts by distance with `near`, by relevance with `query`, otherwise by catalogue weight. `distance` requires `near`.",
      -  "enum": [
      -    "recommended",
      -    "price-asc",
      -    "price-desc",
      -    "star-desc",
      -    "distance"
      -  ],
      -  "type": "string"
      -}
    • removedInput schema / properties / starMax
      Removed value: -{
      -  "description": "Highest star rating to include.",
      -  "maximum": 5,
      -  "minimum": 0,
      -  "type": "number"
      -}
    • removedInput schema / properties / starMin
      Removed value: -{
      -  "description": "Lowest star rating to include.",
      -  "maximum": 5,
      -  "minimum": 0,
      -  "type": "number"
      -}
    • addedInput schema / properties / stay
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Dates and party. Needed for indicative prices. Search uses only the dates when the rooms differ.",
      +  "properties": {
      +    "checkIn": {
      +      "description": "Check-in date in the hotel's calendar, yyyy-MM-dd.",
      +      "type": "string"
      +    },
      +    "checkOut": {
      +      "description": "Check-out date in the hotel's calendar, yyyy-MM-dd. Stays are 1 to 30 nights.",
      +      "type": "string"
      +    },
      +    "rooms": {
      +      "description": "The rooms wanted, 1 to 8, each with its own party.",
      +      "items": {
      +        "additionalProperties": false,
      +        "properties": {
      +          "adults": {
      +            "description": "Adults in this room.",
      +            "maximum": 8,
      +            "minimum": 1,
      +            "type": "integer"
      +          },
      +          "childrenAges": {
      +            "description": "Age of each child in this room, 0 to 17. An empty list means no children.",
      +            "items": {
      +              "maximum": 17,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "maxItems": 4,
      +            "type": "array"
      +          }
      +        },
      +        "required": [
      +          "adults",
      +          "childrenAges"
      +        ],
      +        "type": "object"
      +      },
      +      "maxItems": 8,
      +      "minItems": 1,
      +      "type": "array"
      +    }
      +  },
      +  "required": [
      +    "checkIn",
      +    "checkOut",
      +    "rooms"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / text
      Added value: +{
      +  "description": "Hotel name, brand or area to match, 1 to 128 characters. A first page needs this or `destination`.",
      +  "maxLength": 128,
      +  "minLength": 1,
      +  "type": "string"
      +}
    • removedInput schema / required
      Removed value: -[
      -  "checkIn",
      -  "checkOut"
      -]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "properties": {
      +    "coverage": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "excludedNoFacilityData": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "excludedNoPrice": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "localities": {
      +          "anyOf": [
      +            {
      +              "additionalProperties": {},
      +              "properties": {
      +                "items": {
      +                  "items": {
      +                    "additionalProperties": {},
      +                    "properties": {
      +                      "count": {
      +                        "maximum": 9007199254740991,
      +                        "minimum": -9007199254740991,
      +                        "type": "integer"
      +                      },
      +                      "includes": {
      +                        "items": {
      +                          "additionalProperties": {},
      +                          "properties": {
      +                            "members": {
      +                              "maximum": 9007199254740991,
      +                              "minimum": -9007199254740991,
      +                              "type": "integer"
      +                            },
      +                            "place": {
      +                              "additionalProperties": {},
      +                              "properties": {
      +                                "name": {
      +                                  "type": "string"
      +                                },
      +                                "names": {
      +                                  "additionalProperties": {},
      +                                  "properties": {
      +                                    "en": {
      +                                      "type": [
      +                                        "string",
      +                                        "null"
      +                                      ]
      +                                    },
      +                                    "zh": {
      +                                      "type": [
      +                                        "string",
      +                                        "null"
      +                                      ]
      +                                    }
      +                                  },
      +                                  "required": [
      +                                    "en",
      +                                    "zh"
      +                                  ],
      +                                  "type": "object"
      +                                },
      +                                "placeId": {
      +                                  "pattern": "^plc_\\d{1,12}$",
      +                                  "type": "string"
      +                                }
      +                              },
      +                              "required": [
      +                                "placeId",
      +                                "name",
      +                                "names"
      +                              ],
      +                              "type": "object"
      +                            }
      +                          },
      +                          "required": [
      +                            "place",
      +                            "members"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        "type": "array"
      +                      },
      +                      "place": {
      +                        "additionalProperties": {},
      +                        "properties": {
      +                          "name": {
      +                            "type": "string"
      +                          },
      +                          "names": {
      +                            "additionalProperties": {},
      +                            "properties": {
      +                              "en": {
      +                                "type": [
      +                                  "string",
      +                                  "null"
      +                                ]
      +                              },
      +                              "zh": {
      +                                "type": [
      +                                  "string",
      +                                  "null"
      +                                ]
      +                              }
      +                            },
      +                            "required": [
      +                              "en",
      +                              "zh"
      +                            ],
      +                            "type": "object"
      +                          },
      +                          "placeId": {
      +                            "pattern": "^plc_\\d{1,12}$",
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "placeId",
      +                          "name",
      +                          "names"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "total": {
      +                        "maximum": 9007199254740991,
      +                        "minimum": -9007199254740991,
      +                        "type": "integer"
      +                      }
      +                    },
      +                    "required": [
      +                      "place",
      +                      "count",
      +                      "total",
      +                      "includes"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "type": "array"
      +                },
      +                "more": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                "unassigned": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "items",
      +                "unassigned",
      +                "more"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "matched": {
      +          "maximum": 9007199254740991,
      +          "minimum": -9007199254740991,
      +          "type": "integer"
      +        },
      +        "nameAsText": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "poolRadiusMeters": {
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "priced": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "textAnywhere": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "withPrice": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "withinMaxRadius": {
      +          "anyOf": [
      +            {
      +              "maximum": 9007199254740991,
      +              "minimum": -9007199254740991,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "required": [
      +        "matched",
      +        "priced",
      +        "withPrice",
      +        "poolRadiusMeters",
      +        "excludedNoPrice",
      +        "excludedNoFacilityData",
      +        "withinMaxRadius",
      +        "textAnywhere",
      +        "localities",
      +        "nameAsText"
      +      ],
      +      "type": "object"
      +    },
      +    "data": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "address": {
      +            "additionalProperties": {},
      +            "properties": {
      +              "countryCode": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "line": {
      +                "anyOf": [
      +                  {
      +                    "additionalProperties": {},
      +                    "properties": {
      +                      "locale": {
      +                        "anyOf": [
      +                          {
      +                            "enum": [
      +                              "en",
      +                              "zh"
      +                            ],
      +                            "type": "string"
      +                          },
      +                          {
      +                            "type": "string"
      +                          }
      +                        ]
      +                      },
      +                      "text": {
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "text",
      +                      "locale"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              },
      +              "region": {
      +                "anyOf": [
      +                  {
      +                    "additionalProperties": {},
      +                    "properties": {
      +                      "name": {
      +                        "type": "string"
      +                      },
      +                      "names": {
      +                        "additionalProperties": {},
      +                        "properties": {
      +                          "en": {
      +                            "type": [
      +                              "string",
      +                              "null"
      +                            ]
      +                          },
      +                          "zh": {
      +                            "type": [
      +                              "string",
      +                              "null"
      +                            ]
      +                          }
      +                        },
      +                        "required": [
      +                          "en",
      +                          "zh"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      "placeId": {
      +                        "pattern": "^plc_\\d{1,12}$",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "placeId",
      +                      "name",
      +                      "names"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  {
      +                    "type": "null"
      +                  }
      +                ]
      +              }
      +            },
      +            "required": [
      +              "line",
      +              "countryCode",
      +              "region"
      +            ],
      +            "type": "object"
      +          },
      +          "distanceMeters": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "hotelId": {
      +            "pattern": "^htl_[0-9A-Za-z]{20}$",
      +            "type": "string"
      +          },
      +          "location": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": {},
      +                "properties": {
      +                  "lat": {
      +                    "type": "number"
      +                  },
      +                  "lng": {
      +                    "type": "number"
      +                  }
      +                },
      +                "required": [
      +                  "lat",
      +                  "lng"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "names": {
      +            "additionalProperties": {},
      +            "properties": {
      +              "en": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "zh": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "en",
      +              "zh"
      +            ],
      +            "type": "object"
      +          },
      +          "photo": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": {},
      +                "properties": {
      +                  "caption": {
      +                    "anyOf": [
      +                      {
      +                        "additionalProperties": {},
      +                        "properties": {
      +                          "locale": {
      +                            "anyOf": [
      +                              {
      +                                "enum": [
      +                                  "en",
      +                                  "zh"
      +                                ],
      +                                "type": "string"
      +                              },
      +                              {
      +                                "type": "string"
      +                              }
      +                            ]
      +                          },
      +                          "text": {
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "text",
      +                          "locale"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  },
      +                  "url": {
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "url",
      +                  "caption"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "price": {
      +            "anyOf": [
      +              {
      +                "additionalProperties": {},
      +                "properties": {
      +                  "approx": {
      +                    "anyOf": [
      +                      {
      +                        "additionalProperties": {},
      +                        "properties": {
      +                          "fromPerRoomNight": {
      +                            "additionalProperties": {},
      +                            "properties": {
      +                              "amount": {
      +                                "pattern": "^\\d+(\\.\\d+)?$",
      +                                "type": "string"
      +                              },
      +                              "currency": {
      +                                "pattern": "^[A-Z]{3}$",
      +                                "type": "string"
      +                              }
      +                            },
      +                            "required": [
      +                              "amount",
      +                              "currency"
      +                            ],
      +                            "type": "object"
      +                          },
      +                          "fromPerRoomStay": {
      +                            "additionalProperties": {},
      +                            "properties": {
      +                              "amount": {
      +                                "pattern": "^\\d+(\\.\\d+)?$",
      +                                "type": "string"
      +                              },
      +                              "currency": {
      +                                "pattern": "^[A-Z]{3}$",
      +                                "type": "string"
      +                              }
      +                            },
      +                            "required": [
      +                              "amount",
      +                              "currency"
      +                            ],
      +                            "type": "object"
      +                          },
      +                          "rateDate": {
      +                            "type": "string"
      +                          }
      +                        },
      +                        "required": [
      +                          "fromPerRoomNight",
      +                          "fromPerRoomStay",
      +                          "rateDate"
      +                        ],
      +                        "type": "object"
      +                      },
      +                      {
      +                        "type": "null"
      +                      }
      +                    ]
      +                  },
      +                  "basis": {
      +                    "anyOf": [
      +                      {
      +                        "enum": [
      +                          "lowest_unit"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "string"
      +                      }
      +                    ]
      +                  },
      +                  "fromPerRoomNight": {
      +                    "additionalProperties": {},
      +                    "properties": {
      +                      "amount": {
      +                        "pattern": "^\\d+(\\.\\d+)?$",
      +                        "type": "string"
      +                      },
      +                      "currency": {
      +                        "pattern": "^[A-Z]{3}$",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "amount",
      +                      "currency"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "fromPerRoomStay": {
      +                    "additionalProperties": {},
      +                    "properties": {
      +                      "amount": {
      +                        "pattern": "^\\d+(\\.\\d+)?$",
      +                        "type": "string"
      +                      },
      +                      "currency": {
      +                        "pattern": "^[A-Z]{3}$",
      +                        "type": "string"
      +                      }
      +                    },
      +                    "required": [
      +                      "amount",
      +                      "currency"
      +                    ],
      +                    "type": "object"
      +                  },
      +                  "kind": {
      +                    "anyOf": [
      +                      {
      +                        "enum": [
      +                          "indicative"
      +                        ],
      +                        "type": "string"
      +                      },
      +                      {
      +                        "type": "string"
      +                      }
      +                    ]
      +                  }
      +                },
      +                "required": [
      +                  "kind",
      +                  "basis",
      +                  "fromPerRoomNight",
      +                  "fromPerRoomStay",
      +                  "approx"
      +                ],
      +                "type": "object"
      +              },
      +              {
      +                "type": "null"
      +              }
      +            ]
      +          },
      +          "stars": {
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "timeZone": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "required": [
      +          "hotelId",
      +          "name",
      +          "names",
      +          "stars",
      +          "address",
      +          "location",
      +          "timeZone",
      +          "distanceMeters",
      +          "price"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "destination": {
      +      "anyOf": [
      +        {
      +          "anyOf": [
      +            {
      +              "additionalProperties": {},
      +              "properties": {
      +                "center": {
      +                  "additionalProperties": {},
      +                  "properties": {
      +                    "basis": {
      +                      "anyOf": [
      +                        {
      +                          "enum": [
      +                            "seat",
      +                            "capital",
      +                            "busiest_settlement",
      +                            "hub",
      +                            "point"
      +                          ],
      +                          "type": "string"
      +                        },
      +                        {
      +                          "type": "string"
      +                        }
      +                      ]
      +                    },
      +                    "location": {
      +                      "additionalProperties": {},
      +                      "properties": {
      +                        "lat": {
      +                          "type": "number"
      +                        },
      +                        "lng": {
      +                          "type": "number"
      +                        }
      +                      },
      +                      "required": [
      +                        "lat",
      +                        "lng"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    "place": {
      +                      "anyOf": [
      +                        {
      +                          "additionalProperties": {},
      +                          "properties": {
      +                            "name": {
      +                              "type": "string"
      +                            },
      +                            "names": {
      +                              "additionalProperties": {},
      +                              "properties": {
      +                                "en": {
      +                                  "type": [
      +                                    "string",
      +                                    "null"
      +                                  ]
      +                                },
      +                                "zh": {
      +                                  "type": [
      +                                    "string",
      +                                    "null"
      +                                  ]
      +                                }
      +                              },
      +                              "required": [
      +                                "en",
      +                                "zh"
      +                              ],
      +                              "type": "object"
      +                            },
      +                            "placeId": {
      +                              "pattern": "^plc_\\d{1,12}$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "placeId",
      +                            "name",
      +                            "names"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ]
      +                    }
      +                  },
      +                  "required": [
      +                    "location",
      +                    "place",
      +                    "basis"
      +                  ],
      +                  "type": "object"
      +                },
      +                "kind": {
      +                  "const": "place",
      +                  "type": "string"
      +                },
      +                "otherMatches": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                "place": {
      +                  "additionalProperties": {},
      +                  "properties": {
      +                    "cityLike": {
      +                      "type": [
      +                        "boolean",
      +                        "null"
      +                      ]
      +                    },
      +                    "countryCode": {
      +                      "type": "string"
      +                    },
      +                    "kind": {
      +                      "anyOf": [
      +                        {
      +                          "enum": [
      +                            "country",
      +                            "region",
      +                            "district",
      +                            "settlement",
      +                            "neighbourhood",
      +                            "island"
      +                          ],
      +                          "type": "string"
      +                        },
      +                        {
      +                          "type": "string"
      +                        }
      +                      ]
      +                    },
      +                    "location": {
      +                      "additionalProperties": {},
      +                      "properties": {
      +                        "lat": {
      +                          "type": "number"
      +                        },
      +                        "lng": {
      +                          "type": "number"
      +                        }
      +                      },
      +                      "required": [
      +                        "lat",
      +                        "lng"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    "name": {
      +                      "type": "string"
      +                    },
      +                    "names": {
      +                      "additionalProperties": {},
      +                      "properties": {
      +                        "en": {
      +                          "type": [
      +                            "string",
      +                            "null"
      +                          ]
      +                        },
      +                        "zh": {
      +                          "type": [
      +                            "string",
      +                            "null"
      +                          ]
      +                        }
      +                      },
      +                      "required": [
      +                        "en",
      +                        "zh"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    "placeId": {
      +                      "pattern": "^plc_\\d{1,12}$",
      +                      "type": "string"
      +                    },
      +                    "population": {
      +                      "anyOf": [
      +                        {
      +                          "maximum": 9007199254740991,
      +                          "minimum": -9007199254740991,
      +                          "type": "integer"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ]
      +                    },
      +                    "region": {
      +                      "anyOf": [
      +                        {
      +                          "additionalProperties": {},
      +                          "properties": {
      +                            "name": {
      +                              "type": "string"
      +                            },
      +                            "names": {
      +                              "additionalProperties": {},
      +                              "properties": {
      +                                "en": {
      +                                  "type": [
      +                                    "string",
      +                                    "null"
      +                                  ]
      +                                },
      +                                "zh": {
      +                                  "type": [
      +                                    "string",
      +                                    "null"
      +                                  ]
      +                                }
      +                              },
      +                              "required": [
      +                                "en",
      +                                "zh"
      +                              ],
      +                              "type": "object"
      +                            },
      +                            "placeId": {
      +                              "pattern": "^plc_\\d{1,12}$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "placeId",
      +                            "name",
      +                            "names"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ]
      +                    },
      +                    "scope": {
      +                      "anyOf": [
      +                        {
      +                          "enum": [
      +                            "area",
      +                            "radius"
      +                          ],
      +                          "type": "string"
      +                        },
      +                        {
      +                          "type": "string"
      +                        }
      +                      ]
      +                    }
      +                  },
      +                  "required": [
      +                    "placeId",
      +                    "name",
      +                    "names",
      +                    "kind",
      +                    "scope",
      +                    "cityLike",
      +                    "population",
      +                    "region",
      +                    "countryCode",
      +                    "location"
      +                  ],
      +                  "type": "object"
      +                },
      +                "radiusMeters": {
      +                  "type": [
      +                    "number",
      +                    "null"
      +                  ]
      +                },
      +                "radiusSource": {
      +                  "anyOf": [
      +                    {
      +                      "anyOf": [
      +                        {
      +                          "enum": [
      +                            "default",
      +                            "requested"
      +                          ],
      +                          "type": "string"
      +                        },
      +                        {
      +                          "type": "string"
      +                        }
      +                      ]
      +                    },
      +                    {
      +                      "type": "null"
      +                    }
      +                  ]
      +                },
      +                "resolution": {
      +                  "anyOf": [
      +                    {
      +                      "enum": [
      +                        "only_match",
      +                        "dominant",
      +                        "by_id",
      +                        "by_country_code",
      +                        "by_locality"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "string"
      +                    }
      +                  ]
      +                },
      +                "scope": {
      +                  "anyOf": [
      +                    {
      +                      "enum": [
      +                        "area",
      +                        "radius",
      +                        "locality"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "string"
      +                    }
      +                  ]
      +                }
      +              },
      +              "required": [
      +                "kind",
      +                "place",
      +                "resolution",
      +                "otherMatches",
      +                "scope",
      +                "center",
      +                "radiusMeters",
      +                "radiusSource"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "additionalProperties": {},
      +              "properties": {
      +                "center": {
      +                  "additionalProperties": {},
      +                  "properties": {
      +                    "basis": {
      +                      "anyOf": [
      +                        {
      +                          "enum": [
      +                            "seat",
      +                            "capital",
      +                            "busiest_settlement",
      +                            "hub",
      +                            "point"
      +                          ],
      +                          "type": "string"
      +                        },
      +                        {
      +                          "type": "string"
      +                        }
      +                      ]
      +                    },
      +                    "location": {
      +                      "additionalProperties": {},
      +                      "properties": {
      +                        "lat": {
      +                          "type": "number"
      +                        },
      +                        "lng": {
      +                          "type": "number"
      +                        }
      +                      },
      +                      "required": [
      +                        "lat",
      +                        "lng"
      +                      ],
      +                      "type": "object"
      +                    },
      +                    "place": {
      +                      "anyOf": [
      +                        {
      +                          "additionalProperties": {},
      +                          "properties": {
      +                            "name": {
      +                              "type": "string"
      +                            },
      +                            "names": {
      +                              "additionalProperties": {},
      +                              "properties": {
      +                                "en": {
      +                                  "type": [
      +                                    "string",
      +                                    "null"
      +                                  ]
      +                                },
      +                                "zh": {
      +                                  "type": [
      +                                    "string",
      +                                    "null"
      +                                  ]
      +                                }
      +                              },
      +                              "required": [
      +                                "en",
      +                                "zh"
      +                              ],
      +                              "type": "object"
      +                            },
      +                            "placeId": {
      +                              "pattern": "^plc_\\d{1,12}$",
      +                              "type": "string"
      +                            }
      +                          },
      +                          "required": [
      +                            "placeId",
      +                            "name",
      +                            "names"
      +                          ],
      +                          "type": "object"
      +                        },
      +                        {
      +                          "type": "null"
      +                        }
      +                      ]
      +                    }
      +                  },
      +                  "required": [
      +                    "location",
      +                    "place",
      +                    "basis"
      +                  ],
      +                  "type": "object"
      +                },
      +                "kind": {
      +                  "const": "point",
      +                  "type": "string"
      +                },
      +                "radiusMeters": {
      +                  "type": "number"
      +                },
      +                "radiusSource": {
      +                  "anyOf": [
      +                    {
      +                      "enum": [
      +                        "default",
      +                        "requested"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "string"
      +                    }
      +                  ]
      +                },
      +                "scope": {
      +                  "anyOf": [
      +                    {
      +                      "enum": [
      +                        "radius"
      +                      ],
      +                      "type": "string"
      +                    },
      +                    {
      +                      "type": "string"
      +                    }
      +                  ]
      +                }
      +              },
      +              "required": [
      +                "kind",
      +                "center",
      +                "scope",
      +                "radiusMeters",
      +                "radiusSource"
      +              ],
      +              "type": "object"
      +            },
      +            {
      +              "additionalProperties": {},
      +              "properties": {
      +                "kind": {
      +                  "type": "string"
      +                }
      +              },
      +              "required": [
      +                "kind"
      +              ],
      +              "type": "object"
      +            }
      +          ]
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "nextCursor": {
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "notes": {
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "code": {
      +            "anyOf": [
      +              {
      +                "enum": [
      +                  "indicative_prices",
      +                  "prices_unavailable",
      +                  "pool_limited",
      +                  "amenities_listed_only",
      +                  "place_resolved_dominant",
      +                  "area_absorbed",
      +                  "broad_area",
      +                  "island_radius",
      +                  "area_retired",
      +                  "more_outside_radius",
      +                  "more_elsewhere",
      +                  "few_hotels_in_scope",
      +                  "party_split_required",
      +                  "no_results",
      +                  "locality_available"
      +                ],
      +                "type": "string"
      +              },
      +              {
      +                "type": "string"
      +              }
      +            ]
      +          },
      +          "message": {
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "code",
      +          "message"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "pricing": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "mode": {
      +          "anyOf": [
      +            {
      +              "enum": [
      +                "indicative",
      +                "none"
      +              ],
      +              "type": "string"
      +            },
      +            {
      +              "type": "string"
      +            }
      +          ]
      +        },
      +        "scope": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "page",
      +                    "pool"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "string"
      +                }
      +              ]
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "status": {
      +          "anyOf": [
      +            {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "ok",
      +                    "unavailable"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "string"
      +                }
      +              ]
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        }
      +      },
      +      "required": [
      +        "mode",
      +        "scope",
      +        "status"
      +      ],
      +      "type": "object"
      +    },
      +    "sort": {
      +      "anyOf": [
      +        {
      +          "enum": [
      +            "distance",
      +            "relevance",
      +            "stars_desc",
      +            "price_asc",
      +            "price_desc"
      +          ],
      +          "type": "string"
      +        },
      +        {
      +          "type": "string"
      +        }
      +      ]
      +    },
      +    "stay": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "properties": {
      +            "checkIn": {
      +              "type": "string"
      +            },
      +            "checkOut": {
      +              "type": "string"
      +            },
      +            "rooms": {
      +              "items": {
      +                "additionalProperties": {},
      +                "properties": {
      +                  "adults": {
      +                    "maximum": 9007199254740991,
      +                    "minimum": -9007199254740991,
      +                    "type": "integer"
      +                  },
      +                  "childrenAges": {
      +                    "items": {
      +                      "maximum": 9007199254740991,
      +                      "minimum": -9007199254740991,
      +                      "type": "integer"
      +                    },
      +                    "type": "array"
      +                  }
      +                },
      +                "required": [
      +                  "adults",
      +                  "childrenAges"
      +                ],
      +                "type": "object"
      +              },
      +              "minItems": 1,
      +              "type": "array"
      +            }
      +          },
      +          "required": [
      +            "checkIn",
      +            "checkOut",
      +            "rooms"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "text": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": {},
      +          "properties": {
      +            "match": {
      +              "anyOf": [
      +                {
      +                  "enum": [
      +                    "exact"
      +                  ],
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "string"
      +                }
      +              ]
      +            },
      +            "value": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "value",
      +            "match"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    }
      +  },
      +  "required": [
      +    "destination",
      +    "text",
      +    "stay",
      +    "pricing",
      +    "sort",
      +    "coverage",
      +    "data",
      +    "nextCursor",
      +    "notes"
      +  ],
      +  "type": "object"
      +}
  7. Changed17 schema fields changed
    • addedInput schema / properties / checkIn / description
      Added value: +"Check-in date, yyyy-MM-dd."
    • addedInput schema / properties / checkOut / description
      Added value: +"Check-out date, yyyy-MM-dd. Stays are 1 to 15 nights."
    • addedInput schema / properties / cityCode / description
      Added value: +"Catalogue city code, as returned in `hotels[].cityCode`."
    • changedInput schema / properties / currency / description
      Previous value: -"Currency to show prices in, converted from the supplier's at Stripe's exchange rate."New value: +"Currency to show prices in. Prices are converted from the supplier's at Stripe's exchange rate; the response's `fx` says how."
    • addedInput schema / properties / facilities / description
      Added value: +"Facilities every hotel must have. Names must match the catalogue exactly (case-insensitive), e.g. `Swimming pool`, `Parking`."
    • addedInput schema / properties / near / description
      Added value: +"Search around a point."
    • addedInput schema / properties / near / properties / lat / description
      Added value: +"Latitude."
    • addedInput schema / properties / near / properties / lng / description
      Added value: +"Longitude."
    • addedInput schema / properties / near / properties / radiusKm / description
      Added value: +"Radius in kilometres."
    • addedInput schema / properties / page / description
      Added value: +"Page number."
    • addedInput schema / properties / pageSize / description
      Added value: +"Hotels per page."
    • addedInput schema / properties / priceMax / description
      Added value: +"Highest average nightly price, in `currency`."
    • addedInput schema / properties / priceMin / description
      Added value: +"Lowest average nightly price, in `currency`. Applied to indicative prices."
    • addedInput schema / properties / query / description
      Added value: +"Hotel name, brand or city to search for. Provide at least one of `query`, `cityCode` or `near`."
    • addedInput schema / properties / sortBy / description
      Added value: +"Result order. `recommended` sorts by distance with `near`, by relevance with `query`, otherwise by catalogue weight. `distance` requires `near`."
    • addedInput schema / properties / starMax / description
      Added value: +"Highest star rating to include."
    • addedInput schema / properties / starMin / description
      Added value: +"Lowest star rating to include."
  8. First observed

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description goes beyond them by disclosing that returned prices are estimates, that the answer includes scope, counts and notes, and that pagination is cursor-driven. It stops short of covering rate limits or how the scope/counts are shaped, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five sentences, front-loaded with the core action, then pricing caveats, matching semantics, error branches, and paging. Dense but every sentence carries distinct information; the destination-form enumeration is the one part that overlaps heavily with the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, deeply nested search tool with an output schema and full annotation coverage, the description supplies what the schema cannot: when prices are indicative versus bookable, which sibling to escalate to, and how the error responses are structured. Nothing an agent needs to select or invoke it correctly appears to be missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents every parameter, including the destination oneOf variants, sort defaults, and the stay/rooms structure in detail. The description adds only modest nuance, notably that text matches word for word and the enumeration of destination forms, so it largely paraphrases structured data and the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Find hotels') plus the two retrieval modes (destination and/or text) and the price behavior when a stay is supplied. It explicitly separates itself from get_hotel_offers by stating that indicative prices are not bookable and that the sibling returns what the user actually pays.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete routing rules: use get_hotel_offers for bookable prices, use destination for structured places, use text for name/brand/area matching, and use cursor plus optionally limit for a next page with nothing else. It also names the two failure branches (destination_ambiguous, search_too_broad) and says each error carries its own next step, which tells the agent how to recover rather than guess.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources