{"openapi":"3.1.1","info":{"title":"Fortrip API","version":"4.3.0"},"servers":[{"url":"https://api.fortrip.ai"}],"paths":{"/v1/hotels/search":{"post":{"operationId":"search_hotels","summary":"Search hotels","description":"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. A name several places bear answers destination_ambiguous with candidates: ask the user, then search the chosen placeId. 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 search too broad to answer is refused with search_too_broad and its localities: pass one back as { kind: \"locality\", placeId }, never by name. The answer states the scope, the counts and notes; a next page is the cursor and, optionally, limit.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"destination":{"description":"Where to search. A first page needs this or `text`.","oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"place_name","description":"A place named in words, with its country."},"name":{"type":"string","minLength":1,"maxLength":128,"description":"The place name, in any language, e.g. Tokyo or 东京."},"countryCode":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2 country the place is in, e.g. JP."},"radiusMeters":{"description":"Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.","type":"integer","minimum":1,"maximum":80000}},"required":["kind","name","countryCode"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"place","description":"A place id from an earlier response."},"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$","description":"placeId from an earlier response."},"radiusMeters":{"description":"Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.","type":"integer","minimum":1,"maximum":80000}},"required":["kind","placeId"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"point","description":"A point on the map."},"location":{"type":"object","properties":{"lat":{"type":"number","minimum":-90,"maximum":90,"description":"Latitude, WGS84."},"lng":{"type":"number","minimum":-180,"maximum":180,"description":"Longitude, WGS84."}},"required":["lat","lng"],"additionalProperties":false,"description":"The point, WGS84."},"radiusMeters":{"description":"Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.","type":"integer","minimum":1,"maximum":80000}},"required":["kind","location"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"country","description":"A whole country."},"countryCode":{"type":"string","pattern":"^[A-Z]{2}$","description":"ISO 3166-1 alpha-2 country, e.g. JP."}},"required":["kind","countryCode"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"locality","description":"A locality (hub) listed in an earlier search response."},"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$","description":"placeId of the locality."},"radiusMeters":{"description":"Search radius around the destination in meters, 1 to 80000. Left out, the service picks one.","type":"integer","minimum":1,"maximum":80000}},"required":["kind","placeId"],"additionalProperties":false}]},"text":{"description":"Hotel name, brand or area to match, 1 to 128 characters. A first page needs this or `destination`.","type":"string","minLength":1,"maxLength":128},"stay":{"description":"Dates and party. Needed for indicative prices. Search uses only the dates when the rooms differ.","type":"object","properties":{"checkIn":{"type":"string","description":"Check-in date in the hotel's calendar, yyyy-MM-dd."},"checkOut":{"type":"string","description":"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."},"rooms":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"maximum":8,"description":"Adults in this room."},"childrenAges":{"maxItems":4,"type":"array","items":{"type":"integer","minimum":0,"maximum":17},"description":"Age of each child in this room, 0 to 17. An empty list means no children."}},"required":["adults","childrenAges"],"additionalProperties":false},"description":"The rooms wanted, 1 to 8, each with its party; offers and orders need every room the same."}},"required":["checkIn","checkOut","rooms"],"additionalProperties":false},"pricing":{"description":"`indicative` adds an approximate price per hotel and needs a stay; `none` skips prices. Default: indicative with a stay, otherwise none.","type":"string","enum":["indicative","none"]},"filters":{"description":"Filters every hotel in the answer must pass.","type":"object","properties":{"stars":{"description":"Star rating range. Unrated hotels are left out whenever it is set.","type":"object","properties":{"min":{"description":"Lowest star rating, 1 to 5 in steps of 0.5.","type":"number","minimum":1,"maximum":5},"max":{"description":"Highest star rating, 1 to 5 in steps of 0.5.","type":"number","minimum":1,"maximum":5}},"additionalProperties":false},"amenities":{"description":"Amenities every hotel must list. Only some codes can filter; asking for one that cannot is answered with the list that can.","minItems":1,"maxItems":9,"type":"array","items":{"type":"string","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"]}},"price":{"description":"Price limit. Needs indicative pricing, so a stay.","type":"object","properties":{"maxPerRoomNight":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$","description":"Decimal string such as 132.40, never a number."},"currency":{"type":"string","const":"USD","description":"Always USD in a request."}},"required":["amount","currency"],"additionalProperties":false,"description":"Highest price per room per night, in USD."}},"required":["maxPerRoomNight"],"additionalProperties":false}},"additionalProperties":false},"sort":{"description":"Result order. `distance` needs a destination, `relevance` needs `text`, `price_asc` and `price_desc` need indicative pricing. Default: relevance with `text`, otherwise distance.","type":"string","enum":["distance","relevance","stars_desc","price_asc","price_desc"]},"limit":{"description":"Hotels per page, 1 to 50. Default 20.","type":"integer","minimum":1,"maximum":50},"cursor":{"description":"`nextCursor` from the previous response. A next page is the cursor and, optionally, `limit`; nothing else.","type":"string","minLength":1},"locale":{"type":"string","enum":["en","zh"],"description":"Language for names and text in the response: en or zh."},"displayCurrency":{"type":"string","enum":["USD","CNY"],"description":"Currency to show prices in, USD or CNY. It never changes what is charged: payment is in USD."}},"additionalProperties":false}}}},"responses":{"200":{"description":"Search hotels","content":{"application/json":{"schema":{"type":"object","properties":{"destination":{"anyOf":[{"anyOf":[{"type":"object","properties":{"kind":{"type":"string","const":"place"},"place":{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}},"kind":{"anyOf":[{"type":"string","enum":["country","region","district","settlement","neighbourhood","island"]},{"type":"string"}]},"scope":{"anyOf":[{"type":"string","enum":["area","radius"]},{"type":"string"}]},"cityLike":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"population":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"region":{"anyOf":[{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},{"type":"null"}]},"countryCode":{"type":"string"},"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":{}}},"required":["placeId","name","names","kind","scope","cityLike","population","region","countryCode","location"],"additionalProperties":{}},"resolution":{"anyOf":[{"type":"string","enum":["only_match","dominant","by_id","by_country_code","by_locality"]},{"type":"string"}]},"otherMatches":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"scope":{"anyOf":[{"type":"string","enum":["area","radius","locality"]},{"type":"string"}]},"center":{"type":"object","properties":{"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":{}},"place":{"anyOf":[{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},{"type":"null"}]},"basis":{"anyOf":[{"type":"string","enum":["seat","capital","busiest_settlement","hub","point"]},{"type":"string"}]}},"required":["location","place","basis"],"additionalProperties":{}},"radiusMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"radiusSource":{"anyOf":[{"anyOf":[{"type":"string","enum":["default","requested"]},{"type":"string"}]},{"type":"null"}]}},"required":["kind","place","resolution","otherMatches","scope","center","radiusMeters","radiusSource"],"additionalProperties":{}},{"type":"object","properties":{"kind":{"type":"string","const":"point"},"center":{"type":"object","properties":{"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":{}},"place":{"anyOf":[{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},{"type":"null"}]},"basis":{"anyOf":[{"type":"string","enum":["seat","capital","busiest_settlement","hub","point"]},{"type":"string"}]}},"required":["location","place","basis"],"additionalProperties":{}},"scope":{"anyOf":[{"type":"string","enum":["radius"]},{"type":"string"}]},"radiusMeters":{"type":"number"},"radiusSource":{"anyOf":[{"type":"string","enum":["default","requested"]},{"type":"string"}]}},"required":["kind","center","scope","radiusMeters","radiusSource"],"additionalProperties":{}},{"type":"object","properties":{"kind":{"type":"string"}},"required":["kind"],"additionalProperties":{}}]},{"type":"null"}]},"text":{"anyOf":[{"type":"object","properties":{"value":{"type":"string"},"match":{"anyOf":[{"type":"string","enum":["exact"]},{"type":"string"}]}},"required":["value","match"],"additionalProperties":{}},{"type":"null"}]},"stay":{"anyOf":[{"type":"object","properties":{"checkIn":{"type":"string"},"checkOut":{"type":"string"},"rooms":{"minItems":1,"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"childrenAges":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"required":["adults","childrenAges"],"additionalProperties":{}}}},"required":["checkIn","checkOut","rooms"],"additionalProperties":{}},{"type":"null"}]},"pricing":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","enum":["indicative","none"]},{"type":"string"}]},"scope":{"anyOf":[{"anyOf":[{"type":"string","enum":["page","pool"]},{"type":"string"}]},{"type":"null"}]},"status":{"anyOf":[{"anyOf":[{"type":"string","enum":["ok","unavailable"]},{"type":"string"}]},{"type":"null"}]}},"required":["mode","scope","status"],"additionalProperties":{}},"sort":{"anyOf":[{"type":"string","enum":["distance","relevance","stars_desc","price_asc","price_desc"]},{"type":"string"}]},"coverage":{"type":"object","properties":{"matched":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"priced":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"withPrice":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"poolRadiusMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"excludedNoPrice":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"excludedNoFacilityData":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"withinMaxRadius":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"textAnywhere":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"localities":{"anyOf":[{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"place":{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"includes":{"type":"array","items":{"type":"object","properties":{"place":{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},"members":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["place","members"],"additionalProperties":{}}}},"required":["place","count","total","includes"],"additionalProperties":{}}},"unassigned":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"more":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","unassigned","more"],"additionalProperties":{}},{"type":"null"}]},"nameAsText":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["matched","priced","withPrice","poolRadiusMeters","excludedNoPrice","excludedNoFacilityData","withinMaxRadius","textAnywhere","localities","nameAsText"],"additionalProperties":{}},"data":{"type":"array","items":{"type":"object","properties":{"hotelId":{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}},"stars":{"anyOf":[{"type":"number"},{"type":"null"}]},"address":{"type":"object","properties":{"line":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"countryCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"region":{"anyOf":[{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},{"type":"null"}]}},"required":["line","countryCode","region"],"additionalProperties":{}},"location":{"anyOf":[{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":{}},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]},"distanceMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"price":{"anyOf":[{"type":"object","properties":{"kind":{"anyOf":[{"type":"string","enum":["indicative"]},{"type":"string"}]},"basis":{"anyOf":[{"type":"string","enum":["lowest_unit"]},{"type":"string"}]},"fromPerRoomNight":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"fromPerRoomStay":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"approx":{"anyOf":[{"type":"object","properties":{"fromPerRoomNight":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"fromPerRoomStay":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"rateDate":{"type":"string"}},"required":["fromPerRoomNight","fromPerRoomStay","rateDate"],"additionalProperties":{}},{"type":"null"}]}},"required":["kind","basis","fromPerRoomNight","fromPerRoomStay","approx"],"additionalProperties":{}},{"type":"null"}]},"photo":{"anyOf":[{"type":"object","properties":{"url":{"type":"string"},"caption":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["url","caption"],"additionalProperties":{}},{"type":"null"}],"description":"The cover photo; null when there is none."}},"required":["hotelId","name","names","stars","address","location","timeZone","distanceMeters","price","photo"],"additionalProperties":{}}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass it back as cursor for the next page; null on the last page."},"notes":{"type":"array","items":{"type":"object","properties":{"code":{"anyOf":[{"type":"string","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"}]},"message":{"type":"string"}},"required":["code","message"],"additionalProperties":{}}}},"required":["destination","text","stay","pricing","sort","coverage","data","nextCursor","notes"],"additionalProperties":{}}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hotels/{hotelId}":{"get":{"operationId":"get_hotel","summary":"Hotel details","description":"One hotel's catalogue facts: names, address, location, time zone, check-in and check-out times, the full description, every policy and the amenities, and its rooms with include: \"rooms\". \"Not listed\" is not \"no\". No prices or availability: get_hotel_offers has those.","security":[{"bearerAuth":[]}],"parameters":[{"name":"hotelId","in":"path","required":true,"schema":{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$","description":"hotelId from a search response."}},{"name":"include","in":"query","required":false,"schema":{"description":"`rooms` adds the room list.","type":"string","enum":["rooms"]}},{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["en","zh"],"description":"Language for names and text in the response: en or zh."}}],"responses":{"200":{"description":"Hotel details","content":{"application/json":{"schema":{"type":"object","properties":{"hotelId":{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}},"bookable":{"type":"boolean"},"stars":{"anyOf":[{"type":"number"},{"type":"null"}]},"address":{"type":"object","properties":{"line":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"countryCode":{"anyOf":[{"type":"string"},{"type":"null"}]},"region":{"anyOf":[{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},{"type":"null"}]}},"required":["line","countryCode","region"],"additionalProperties":{}},"location":{"anyOf":[{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":{}},{"type":"null"}]},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]},"description":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"photos":{"anyOf":[{"type":"array","items":{"type":"object","properties":{"url":{"type":"string"},"caption":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["url","caption"],"additionalProperties":{}}},{"type":"null"}],"description":"Up to 8 hotel photos, the cover first; null when the catalogue lists none."},"checkInTimes":{"type":"object","properties":{"from":{"anyOf":[{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$"},{"type":"null"}]},"until":{"anyOf":[{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$"},{"type":"null"}]}},"required":["from","until"],"additionalProperties":{}},"checkOutTimes":{"type":"object","properties":{"from":{"anyOf":[{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$"},{"type":"null"}]},"until":{"anyOf":[{"type":"string","pattern":"^(?:[01]\\d|2[0-3]):[0-5]\\d$"},{"type":"null"}]}},"required":["from","until"],"additionalProperties":{}},"policies":{"type":"object","properties":{"listed":{"type":"boolean"},"items":{"type":"array","items":{"type":"object","properties":{"topic":{"anyOf":[{"type":"string","enum":["check_in","important_notices","booking","booking_tips","check_in_out","check_in_tips","reception","deposit","meal","extra_bed","pets","surroundings","meetings","non_smoking","other"]},{"type":"string"}]},"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["topic","text","locale"],"additionalProperties":{}}}},"required":["listed","items"],"additionalProperties":{}},"amenities":{"type":"object","properties":{"listed":{"type":"boolean"},"items":{"type":"array","items":{"type":"object","properties":{"code":{"anyOf":[{"type":"string","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"}]},"name":{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]}},"required":["text","locale"],"additionalProperties":{}}},"required":["code","name"],"additionalProperties":{}}}},"required":["listed","items"],"additionalProperties":{}},"breakfastServed":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"deposit":{"type":"object","properties":{"required":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"amount":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]}},"required":["required","amount"],"additionalProperties":{}},"contact":{"type":"object","properties":{"phone":{"anyOf":[{"type":"string"},{"type":"null"}]},"website":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["phone","website"],"additionalProperties":{}},"rooms":{"type":"object","properties":{"listed":{"type":"boolean"},"items":{"type":"array","items":{"type":"object","properties":{"name":{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},"beds":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"areaSqm":{"anyOf":[{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":{}},{"type":"null"}]},"maxOccupancy":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"window":{"anyOf":[{"anyOf":[{"type":"string","enum":["yes","no","partial"]},{"type":"string"}]},{"type":"null"}]}},"required":["name","beds","areaSqm","maxOccupancy","window"],"additionalProperties":{}}}},"required":["listed","items"],"additionalProperties":{}}},"required":["hotelId","name","names","bookable","stars","address","location","timeZone","description","photos","checkInTimes","checkOutTimes","policies","amenities","breakfastServed","deposit","contact"],"additionalProperties":{}}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/hotels/offers":{"post":{"operationId":"get_hotel_offers","summary":"Live offers","description":"Live, bookable offers for up to 15 hotels and one stay. Every room in stay.rooms must have the same party: for different parties, call once per party. Each offer has the room, the meals included, price.total in USD for the whole stay and every room (what is charged), fees payable at the property, the cancellation terms with times in UTC and the hotel's time zone, the confirmation mode, and an offerId for book_hotel that expires at expiresAt. Hotels with nothing to offer are listed under unavailable with the reason. Up to limitPerHotel offers per hotel, default 10, chosen for a spread of choices in this order while room remains: the cheapest offer, the cheapest that can be cancelled free, the cheapest with breakfast, the cheapest of each other room, then the rest by price; listed cheapest first.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"hotelIds":{"minItems":1,"maxItems":15,"type":"array","items":{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},"description":"Hotels to price, 1 to 15, no repeats."},"stay":{"type":"object","properties":{"checkIn":{"type":"string","description":"Check-in date in the hotel's calendar, yyyy-MM-dd."},"checkOut":{"type":"string","description":"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."},"rooms":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":1,"maximum":8,"description":"Adults in this room."},"childrenAges":{"maxItems":4,"type":"array","items":{"type":"integer","minimum":0,"maximum":17},"description":"Age of each child in this room, 0 to 17. An empty list means no children."}},"required":["adults","childrenAges"],"additionalProperties":false},"description":"The rooms wanted, 1 to 8, each with its party; offers and orders need every room the same."}},"required":["checkIn","checkOut","rooms"],"additionalProperties":false,"description":"Dates and party. One party per call: every room must be the same."},"filters":{"description":"Filters every offer must pass.","type":"object","properties":{"requireBreakfast":{"description":"Keep only offers that include breakfast.","type":"boolean"},"requireFreeCancellation":{"description":"Keep only offers that can still be cancelled free of charge.","type":"boolean"}},"additionalProperties":false},"limitPerHotel":{"default":10,"description":"Offers per hotel, 1 to 20. Default 10.","type":"integer","minimum":1,"maximum":20},"locale":{"type":"string","enum":["en","zh"],"description":"Language for names and text in the response: en or zh."},"displayCurrency":{"type":"string","enum":["USD","CNY"],"description":"Currency to show prices in, USD or CNY. It never changes what is charged: payment is in USD."}},"required":["hotelIds","stay"],"additionalProperties":false}}}},"responses":{"200":{"description":"Live offers","content":{"application/json":{"schema":{"type":"object","properties":{"stay":{"type":"object","properties":{"checkIn":{"type":"string"},"checkOut":{"type":"string"},"rooms":{"minItems":1,"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"childrenAges":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"required":["adults","childrenAges"],"additionalProperties":{}}}},"required":["checkIn","checkOut","rooms"],"additionalProperties":{}},"hotels":{"type":"array","items":{"type":"object","properties":{"hotel":{"type":"object","properties":{"hotelId":{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["hotelId","name","names"],"additionalProperties":{}},"offers":{"type":"array","items":{"type":"object","properties":{"offerId":{"type":"string","pattern":"^off_[0-9A-Za-z]{20}$"},"type":{"anyOf":[{"type":"string","enum":["hotel"]},{"type":"string"}]},"expiresAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"hotel":{"type":"object","properties":{"hotelId":{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},"room":{"type":"object","properties":{"name":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"beds":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"areaSqm":{"anyOf":[{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":{}},{"type":"null"}]},"maxOccupancy":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"window":{"anyOf":[{"anyOf":[{"type":"string","enum":["yes","no","partial"]},{"type":"string"}]},{"type":"null"}]}},"required":["name","beds","areaSqm","maxOccupancy","window"],"additionalProperties":{}},"roomCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"meals":{"type":"object","properties":{"known":{"type":"boolean"},"included":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string","enum":["breakfast","lunch","dinner"]},{"type":"string"}]}},{"type":"null"}]},"unspecifiedMainMeals":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"allInclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"guestsCoveredPerRoom":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["known","included","unspecifiedMainMeals","allInclusive","guestsCoveredPerRoom","label"],"additionalProperties":{}}},"required":["hotelId","room","roomCount","meals"],"additionalProperties":{}},"price":{"type":"object","properties":{"total":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"perNightAllRooms":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"approx":{"anyOf":[{"type":"object","properties":{"total":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"perNightAllRooms":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"rateDate":{"type":"string"}},"required":["total","perNightAllRooms","rateDate"],"additionalProperties":{}},{"type":"null"}]},"payAtProperty":{"type":"object","properties":{"disclosure":{"anyOf":[{"type":"string","enum":["complete","incomplete"]},{"type":"string"}]},"items":{"type":"array","items":{"type":"object","properties":{"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"amount":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]},"mandatory":{"type":"boolean"},"basis":{"anyOf":[{"type":"string","enum":["per_stay","per_night","per_person","per_person_per_night","unknown"]},{"type":"string"}]},"collectedAt":{"anyOf":[{"type":"string","enum":["property","unknown"]},{"type":"string"}]}},"required":["label","amount","mandatory","basis","collectedAt"],"additionalProperties":{}}}},"required":["disclosure","items"],"additionalProperties":{}}},"required":["total","perNightAllRooms","approx","payAtProperty"],"additionalProperties":{}},"cancellation":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["free","partial_penalty","non_refundable","unknown"]},{"type":"string"}]},"asOf":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"freeCancellationEndsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"penalties":{"type":"array","items":{"type":"object","properties":{"startsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"amount":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["startsAt","amount"],"additionalProperties":{}}},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["status","asOf","freeCancellationEndsAt","penalties","timeZone"],"additionalProperties":{}},"confirmation":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","enum":["instant","on_request","unknown"]},{"type":"string"}]},"withinMinutes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["mode","withinMinutes"],"additionalProperties":{}}},"required":["offerId","type","expiresAt","hotel","price","cancellation","confirmation"],"additionalProperties":{}}},"omitted":{"type":"object","properties":{"byNationality":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"byFilters":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dominated":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"unreadable":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"byLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["byNationality","byFilters","dominated","unreadable","byLimit"],"additionalProperties":{}}},"required":["hotel","offers","omitted"],"additionalProperties":{}}},"unavailable":{"type":"array","items":{"type":"object","properties":{"hotelId":{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},"reason":{"anyOf":[{"type":"string","enum":["sold_out","no_matching_offers","nationality_restricted","offers_unreadable","not_found","supplier_unavailable","stay_in_past"]},{"type":"string"}]},"omitted":{"anyOf":[{"type":"object","properties":{"byNationality":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"byFilters":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dominated":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"unreadable":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"byLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["byNationality","byFilters","dominated","unreadable","byLimit"],"additionalProperties":{}},{"type":"null"}]}},"required":["hotelId","reason","omitted"],"additionalProperties":{}}}},"required":["stay","hotels","unavailable"],"additionalProperties":{}}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/orders":{"post":{"operationId":"book_hotel","summary":"Create order","description":"Order one offer from get_hotel_offers. The answer is an unpaid order with a payment link: status awaiting_payment, the total, the stay and its terms, and payment.url, a Fortrip page to pay on. Nothing is charged until the order is paid, on that page or with pay_order (or Alipay/WeChat Pay); anyone holding the link can pay. Send the contact and, for each room of the offer, at least one guest. If the price or terms changed since the offer, the answer is offer_changed with every change and a new offer: show the changes and ask the user again before ordering it. Sending the same details again returns the same order. An offer is ordered once: for another order of the stay (another party, or a corrected guest name), get offers again and order the new offer; when it replaces an unpaid order, tell the user to pay only the new link, as the earlier one expires unpaid. To cancel an order, use cancel_order; for changes, or a cancellation cancel_order can't make, the user emails info@fortrip.ai with the order's reference.","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"contact":{"type":"object","properties":{"firstName":{"type":"string","description":"Contact person's first name, at most 59 characters."},"lastName":{"type":"string","description":"Contact person's last name, at most 59 characters."},"email":{"description":"Contact email; the confirmation is sent here.","type":"string"},"phone":{"type":"string","minLength":3,"maxLength":40,"description":"Contact phone number, with country code."}},"required":["firstName","lastName","email","phone"],"additionalProperties":false,"description":"Who the hotel and the confirmation reach."},"items":{"minItems":1,"maxItems":1,"type":"array","items":{"type":"object","properties":{"offerId":{"type":"string","pattern":"^off_[0-9A-Za-z]{20}$","description":"offerId from an offers response."},"hotel":{"type":"object","properties":{"rooms":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"object","properties":{"guests":{"minItems":1,"maxItems":12,"type":"array","items":{"type":"object","properties":{"firstName":{"type":"string","minLength":1,"maxLength":60,"description":"Guest's first name, in Latin letters as on the passport; transliterate accents (Müller → Mueller)."},"lastName":{"type":"string","minLength":1,"maxLength":60,"description":"Guest's last name, in Latin letters as on the passport."}},"required":["firstName","lastName"],"additionalProperties":false},"description":"Guests staying in this room: at least one, no more than the room sleeps."}},"required":["guests"],"additionalProperties":false},"description":"One entry per room of the offer, in order."},"specialRequests":{"description":"Requests for the hotel, in English. Not guaranteed.","type":"string","minLength":0,"maxLength":500}},"required":["rooms"],"additionalProperties":false,"description":"What the hotel needs to know."}},"required":["offerId","hotel"],"additionalProperties":false},"description":"The offer to book: exactly one."}},"required":["contact","items"],"additionalProperties":false}}}},"responses":{"200":{"description":"Create order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}},"headers":{"Idempotent-Replayed":{"required":true,"schema":{"type":"boolean","const":true}}}},"201":{"description":"Create order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}},"get":{"operationId":"list_orders","summary":"List orders","description":"The user's hotel orders, newest first, including those made on the Fortrip website. Pass nextCursor back as cursor for the next page.","security":[{"bearerAuth":[]}],"parameters":[{"name":"cursor","in":"query","required":false,"schema":{"description":"`nextCursor` from the previous page of orders.","type":"string","minLength":1}},{"name":"limit","in":"query","required":false,"schema":{"description":"Orders per page, 1 to 50. Default 20.","type":"integer","minimum":1,"maximum":50}},{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["en","zh"],"description":"Language for names and text in the response: en or zh."}}],"responses":{"200":{"description":"List orders","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"},"reference":{"type":"string","pattern":"^FT-[2-9A-HJ-NP-Z]{6}$"},"status":{"anyOf":[{"type":"string","enum":["awaiting_payment","expired","confirming","confirmed","failed","cancelling","cancelled","needs_attention"]},{"type":"string"}]},"createdAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"updatedAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"items":{"minItems":1,"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"hotel"},"hotel":{"type":"object","properties":{"hotelId":{"anyOf":[{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},{"type":"null"}]},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}},"checkIn":{"type":"string"},"checkOut":{"type":"string"},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]},"rooms":{"minItems":1,"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"childrenAges":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"required":["adults","childrenAges"],"additionalProperties":{}}},"room":{"type":"object","properties":{"name":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"beds":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["name","beds"],"additionalProperties":{}},"meals":{"type":"object","properties":{"known":{"type":"boolean"},"included":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string","enum":["breakfast","lunch","dinner"]},{"type":"string"}]}},{"type":"null"}]},"unspecifiedMainMeals":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"allInclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"guestsCoveredPerRoom":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["known","included","unspecifiedMainMeals","allInclusive","guestsCoveredPerRoom","label"],"additionalProperties":{}},"cancellation":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["free","partial_penalty","non_refundable","unknown"]},{"type":"string"}]},"asOf":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"freeCancellationEndsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"penalties":{"type":"array","items":{"type":"object","properties":{"startsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"amount":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["startsAt","amount"],"additionalProperties":{}}},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["status","asOf","freeCancellationEndsAt","penalties","timeZone"],"additionalProperties":{}},"payAtProperty":{"type":"object","properties":{"disclosure":{"anyOf":[{"type":"string","enum":["complete","incomplete"]},{"type":"string"}]},"items":{"type":"array","items":{"type":"object","properties":{"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"amount":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]},"mandatory":{"type":"boolean"},"basis":{"anyOf":[{"type":"string","enum":["per_stay","per_night","per_person","per_person_per_night","unknown"]},{"type":"string"}]},"collectedAt":{"anyOf":[{"type":"string","enum":["property","unknown"]},{"type":"string"}]}},"required":["label","amount","mandatory","basis","collectedAt"],"additionalProperties":{}}}},"required":["disclosure","items"],"additionalProperties":{}},"confirmationNumber":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["hotelId","name","names","checkIn","checkOut","timeZone","rooms","room","meals","cancellation","payAtProperty","confirmationNumber"],"additionalProperties":{}}},"required":["type","hotel"],"additionalProperties":{}},{"type":"object","properties":{"type":{"type":"string"}},"required":["type"],"additionalProperties":{}}]}},"price":{"type":"object","properties":{"total":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["total"],"additionalProperties":{}},"payment":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["unpaid","authorized","paid","released","refund_pending","refunded"]},{"type":"string"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The payment page, on fortrip.ai. With requiresSignIn false it continues to Stripe Checkout, and anyone holding it can pay; with requiresSignIn true (an order started on the Fortrip website) it continues to the Fortrip booking page, where only the signed-in owner can pay. null when the order isn't awaiting payment, or, while it is, when the link couldn't be read this time: read the order again."},"requiresSignIn":{"type":"boolean"},"expiresAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"chargeCurrency":{"type":"string"},"localCurrencyAtCheckout":{"type":"boolean"},"localCharge":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]},"handlers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"spec":{"type":"string"},"schema":{"type":"string"},"available_instruments":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type"],"additionalProperties":{}}},"config":{"type":"object","properties":{"environment":{"anyOf":[{"type":"string","enum":["livemode","testmode"]},{"type":"string"}]},"business_profile":{"type":"string"}},"required":["environment","business_profile"],"additionalProperties":{}}},"required":["id","type","version","spec","schema","available_instruments","config"],"additionalProperties":{}},"description":"The ways to pay other than url: a com.stripe.payments handler takes a Stripe shared payment token through pay_order. [] when a token can't pay the order: over $500, not charged in USD, an order started on the Fortrip website, a negotiated price, under 15 minutes left, 5 tokens tried, a token payment is under way, or token payment isn't offered for this order."},"credentialLimits":{"anyOf":[{"type":"object","properties":{"maxAmount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Request the token for at least this amount, in cents; a token that allows less can't pay."},"currency":{"type":"string","description":"The token's currency, lowercase as Stripe takes it: usd."},"expiresAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$","description":"Request the token valid until at least this time; the order can't be paid after it."}},"required":["maxAmount","currency","expiresAt"],"additionalProperties":{}},{"type":"null"}],"description":"What the shared payment token for pay_order must allow. null exactly when handlers is []."},"wallets":{"anyOf":[{"type":"object","properties":{"open":{"type":"boolean","description":"Whether pay_order has opened a wallet payment on this order."},"current":{"anyOf":[{"anyOf":[{"type":"string","enum":["wechat_pay","alipay"]},{"type":"string"}]},{"type":"null"}],"description":"The wallet the payment is on now; null until it is open."},"wechatPay":{"anyOf":[{"type":"object","properties":{"qrData":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The WeChat Pay code's content, to draw as a QR code; null when there is no live code (open wechatPay.url for one)."},"qrImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A 480 px PNG of the same code."},"url":{"type":"string","description":"A link, on fortrip.ai, for the user to pay with WeChat Pay; anyone holding it can pay."}},"required":["qrData","qrImageUrl","url"],"additionalProperties":{}},{"type":"null"}],"description":"The WeChat Pay code and link; null until the payment is open."},"alipay":{"anyOf":[{"type":"object","properties":{"url":{"type":"string","description":"A link, on fortrip.ai, for the user to pay with Alipay; anyone holding it can pay."}},"required":["url"],"additionalProperties":{}},{"type":"null"}],"description":"The Alipay link; null until the payment is open."}},"required":["open","current","wechatPay","alipay"],"additionalProperties":{}},{"type":"null"}],"description":"Paying with Alipay or WeChat Pay: pass method alipay_wechat_pay to pay_order to open it. null when the order can't be paid this way and none is open."}},"required":["status","url","requiresSignIn","expiresAt","chargeCurrency","localCurrencyAtCheckout","localCharge","handlers","credentialLimits","wallets"],"additionalProperties":{}},"cancel":{"type":"object","properties":{"available":{"type":"boolean","description":"Whether the user can cancel the order now."},"reason":{"anyOf":[{"type":"string","enum":["cancellable","already_cancelled","in_progress","not_confirmed","stay_started","non_refundable","refused","terms_unknown","needs_attention"]},{"type":"string"}],"description":"cancellable when it can be cancelled now; otherwise why not."},"penalty":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}],"description":"The penalty if cancelled now, under the accepted terms, in the charge currency; null when not stated."},"refund":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}],"description":"What a cancellation now refunds: what was paid less the penalty, in the charge currency; null when not stated."}},"required":["available","reason","penalty","refund"],"additionalProperties":{},"description":"Whether the order can be cancelled now, and for what penalty and refund."},"manageUrl":{"type":"string"}},"required":["orderId","reference","status","createdAt","updatedAt","items","price","payment","cancel","manageUrl"],"additionalProperties":{}}},"nextCursor":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pass it back as cursor for the next page; null on the last page."}},"required":["data","nextCursor"],"additionalProperties":{}}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/orders/{orderId}":{"get":{"operationId":"get_order","summary":"Get order","description":"One of the user's orders by orderId: its status, the payment status and, while it awaits payment, payment.url; the stay and its terms; and the hotel's confirmation number once there is one. Check it after the user pays. An order awaiting payment whose payment.url is null had its link unreadable this time: read it again.","security":[{"bearerAuth":[]}],"parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$","description":"The order's orderId."}},{"name":"locale","in":"query","required":false,"schema":{"type":"string","enum":["en","zh"],"description":"Language for names and text in the response: en or zh."}}],"responses":{"200":{"description":"Get order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/orders/{orderId}/cancel":{"post":{"operationId":"cancel_order","summary":"Cancel order","description":"Cancel one of the user's orders by orderId under its cancellation terms, when its cancel.available is true: the hotel booking is cancelled and cancel.refund, what was paid less cancel.penalty, is refunded. Before you call cancel_order, show the user the order's stay (hotel, dates), cancel.penalty and cancel.refund (amount and currency), then end your reply by asking them to confirm the cancellation, and wait for a clear yes. Pass maximumPenalty as the number in cancel.penalty.amount (\"120.00\" → 120). Never state a refund the order did not return. If the penalty is now higher than maximumPenalty, the answer is cancellation_changed and nothing changes: read the order again and ask the user again. Answers the order: status cancelling, then cancelled once the hotel cancels and the refund is issued; poll get_order. If the hotel refuses, the order goes back to confirmed with cancel.reason refused. Calling it again for the same order answers the order as it is.","security":[{"bearerAuth":[]}],"parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$","description":"The orderId of the order to cancel."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"maximumPenalty":{"type":"number","minimum":0,"description":"The penalty the user agreed to, in the order's currency. Pass maximumPenalty as the number in cancel.penalty.amount (\"120.00\" → 120)."}},"required":["maximumPenalty"],"additionalProperties":false}}}},"responses":{"200":{"description":"Cancel order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/orders/{orderId}/pay":{"post":{"operationId":"pay_order","summary":"Pay order","description":"Pay an order without its link, by shared payment token or Alipay/WeChat Pay (method alipay_wechat_pay). Token: only if payment.handlers isn't empty and you can request one from the user's Link wallet (US and Canadian accounts); never ask the user for one. First show the user the USD total, the stay and every term (meals, cancellation, fees payable at the property), ask them to confirm and wait for a clear yes. Token: request it with config.business_profile and payment.credentialLimits; pass it with price.total. Wallet: pass method, price.total; show payment.wallets (WeChat code as an image if you can, both links); they pay once by either; a code lasts 120 minutes; then the WeChat link opens a new one, or call again. Pay one way only: payment.url or pay_order. On success payment.url stops working; on failure it stays open. Then poll get_order. payment_total_changed: confirm details.total, retry. payment_credential_invalid: new token. service_unavailable: retry. Else payment.url. A token pays one order only.","security":[{"bearerAuth":[]}],"parameters":[{"name":"orderId","in":"path","required":true,"schema":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$","description":"The orderId of the order to pay."}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"sharedPaymentToken":{"description":"The shared payment token (spt_…) the user approved for this order, requested with the order's payment.credentialLimits. Exactly one of sharedPaymentToken, payment and method.","type":"string","pattern":"^spt_[A-Za-z0-9]{1,250}$"},"payment":{"description":"UCP's Complete Checkout payment, in place of sharedPaymentToken: the token as the stripe_payment_token credential of the one selected stripe_payments card instrument. Exactly one of sharedPaymentToken, payment and method.","type":"object","properties":{"instruments":{"minItems":1,"maxItems":8,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"The instrument's id, as the agent's UCP client names it."},"handler_id":{"type":"string","minLength":1,"description":"The id of the handler the instrument pays through: the order's stripe_payments for the selected one."},"type":{"type":"string","minLength":1,"description":"The instrument type: card for the selected one. A Link token is presented as a card instrument, whatever Link funds it with."},"selected":{"description":"Whether this is the instrument to pay with. Exactly one is selected; a lone instrument without it is the one.","type":"boolean"},"credential":{"description":"The instrument's credential: for the selected one, the shared payment token.","type":"object","properties":{"type":{"type":"string","minLength":1,"description":"The credential type: stripe_payment_token for the selected one."},"token":{"description":"The shared payment token (spt_…) the user approved for this order, requested with the order's payment.credentialLimits.","type":"string"}},"required":["type"],"additionalProperties":{}},"display":{"description":"How the wallet shows the instrument, as UCP has it. Not used to pay.","type":"object","properties":{},"additionalProperties":{}}},"required":["id","handler_id","type"],"additionalProperties":{},"description":"A UCP payment instrument."},"description":"The instruments, exactly one of them selected."}},"required":["instruments"],"additionalProperties":false},"method":{"description":"Pay with Alipay or WeChat Pay instead of a token: opens the payment and returns payment.wallets. Exactly one of sharedPaymentToken, payment and method.","type":"string","enum":["alipay_wechat_pay"]},"total":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$","description":"Decimal string such as 132.40, never a number."},"currency":{"type":"string","const":"USD","description":"Always USD in a request."}},"required":["amount","currency"],"additionalProperties":false,"description":"The total the user approved: the order's price.total, exactly as returned."}},"required":["total"],"additionalProperties":false}}}},"responses":{"200":{"description":"Pay order","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/me":{"get":{"operationId":"me","summary":"Signed-in account","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Signed-in account","content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string"},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"name":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["userId","email","name"],"additionalProperties":{}}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/auth/config":{"get":{"operationId":"auth_config","summary":"CLI sign-in settings","security":[],"responses":{"200":{"description":"CLI sign-in settings","content":{"application/json":{"schema":{"type":"object","properties":{"issuer":{"type":"string"},"clientId":{"type":"string"},"scopes":{"type":"string"},"deviceAuthorizationEndpoint":{"type":"string"},"tokenEndpoint":{"type":"string"},"revocationEndpoint":{"type":"string"}},"required":["issuer","clientId","scopes","deviceAuthorizationEndpoint","tokenEndpoint","revocationEndpoint"],"additionalProperties":{}}}}},"default":{"description":"Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}}},"components":{"schemas":{"ErrorEnvelope":{"type":"object","properties":{"error":{"anyOf":[{"type":"object","properties":{"code":{"type":"string","const":"invalid_request"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"issues":{"type":"array","items":{"type":"object","properties":{"pointer":{"type":"string"},"message":{"type":"string"}},"required":["pointer","message"],"additionalProperties":{}}},"filterable":{"type":"array","items":{"anyOf":[{"type":"string","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"}]}},"share":{"type":"object","properties":{"code":{"anyOf":[{"type":"string","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"}]},"listedShare":{"type":"number","minimum":0,"maximum":1}},"required":["code","listedShare"],"additionalProperties":{}}},"required":["issues"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"cursor_invalid"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"reason":{"anyOf":[{"type":"string","enum":["expired","mismatch","malformed"]},{"type":"string"}]}},"required":["reason"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"unauthenticated"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"forbidden"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"not_found"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"order_removed"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"},"reference":{"type":"string","pattern":"^FT-[2-9A-HJ-NP-Z]{6}$"}},"required":["orderId","reference"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"offer_expired"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"offerId":{"type":"string","pattern":"^off_[0-9A-Za-z]{20}$"},"expiredAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"}},"required":["offerId","expiredAt"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"offer_changed"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"changes":{"minItems":1,"type":"array","items":{"anyOf":[{"type":"object","properties":{"field":{"type":"string","const":"price"},"previous":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"current":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"worse":{"type":"boolean"}},"required":["field","previous","current","worse"],"additionalProperties":{}},{"type":"object","properties":{"field":{"type":"string","const":"meals"},"previous":{"type":"object","properties":{"known":{"type":"boolean"},"included":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string","enum":["breakfast","lunch","dinner"]},{"type":"string"}]}},{"type":"null"}]},"unspecifiedMainMeals":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"allInclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"guestsCoveredPerRoom":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["known","included","unspecifiedMainMeals","allInclusive","guestsCoveredPerRoom","label"],"additionalProperties":{}},"current":{"type":"object","properties":{"known":{"type":"boolean"},"included":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string","enum":["breakfast","lunch","dinner"]},{"type":"string"}]}},{"type":"null"}]},"unspecifiedMainMeals":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"allInclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"guestsCoveredPerRoom":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["known","included","unspecifiedMainMeals","allInclusive","guestsCoveredPerRoom","label"],"additionalProperties":{}},"worse":{"type":"boolean"}},"required":["field","previous","current","worse"],"additionalProperties":{}},{"type":"object","properties":{"field":{"type":"string","const":"cancellation"},"previous":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["free","partial_penalty","non_refundable","unknown"]},{"type":"string"}]},"asOf":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"freeCancellationEndsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"penalties":{"type":"array","items":{"type":"object","properties":{"startsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"amount":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["startsAt","amount"],"additionalProperties":{}}},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["status","asOf","freeCancellationEndsAt","penalties","timeZone"],"additionalProperties":{}},"current":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["free","partial_penalty","non_refundable","unknown"]},{"type":"string"}]},"asOf":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"freeCancellationEndsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"penalties":{"type":"array","items":{"type":"object","properties":{"startsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"amount":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["startsAt","amount"],"additionalProperties":{}}},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["status","asOf","freeCancellationEndsAt","penalties","timeZone"],"additionalProperties":{}},"worse":{"type":"boolean"}},"required":["field","previous","current","worse"],"additionalProperties":{}},{"type":"object","properties":{"field":{"type":"string","const":"confirmation"},"previous":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","enum":["instant","on_request","unknown"]},{"type":"string"}]},"withinMinutes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["mode","withinMinutes"],"additionalProperties":{}},"current":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","enum":["instant","on_request","unknown"]},{"type":"string"}]},"withinMinutes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["mode","withinMinutes"],"additionalProperties":{}},"worse":{"type":"boolean"}},"required":["field","previous","current","worse"],"additionalProperties":{}},{"type":"object","properties":{"field":{"type":"string","const":"pay_at_property"},"previous":{"type":"object","properties":{"disclosure":{"anyOf":[{"type":"string","enum":["complete","incomplete"]},{"type":"string"}]},"items":{"type":"array","items":{"type":"object","properties":{"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"amount":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]},"mandatory":{"type":"boolean"},"basis":{"anyOf":[{"type":"string","enum":["per_stay","per_night","per_person","per_person_per_night","unknown"]},{"type":"string"}]},"collectedAt":{"anyOf":[{"type":"string","enum":["property","unknown"]},{"type":"string"}]}},"required":["label","amount","mandatory","basis","collectedAt"],"additionalProperties":{}}}},"required":["disclosure","items"],"additionalProperties":{}},"current":{"type":"object","properties":{"disclosure":{"anyOf":[{"type":"string","enum":["complete","incomplete"]},{"type":"string"}]},"items":{"type":"array","items":{"type":"object","properties":{"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"amount":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]},"mandatory":{"type":"boolean"},"basis":{"anyOf":[{"type":"string","enum":["per_stay","per_night","per_person","per_person_per_night","unknown"]},{"type":"string"}]},"collectedAt":{"anyOf":[{"type":"string","enum":["property","unknown"]},{"type":"string"}]}},"required":["label","amount","mandatory","basis","collectedAt"],"additionalProperties":{}}}},"required":["disclosure","items"],"additionalProperties":{}},"worse":{"type":"boolean"}},"required":["field","previous","current","worse"],"additionalProperties":{}},{"type":"object","properties":{"field":{"type":"string"}},"required":["field"],"additionalProperties":{}}]}},"offer":{"type":"object","properties":{"offerId":{"type":"string","pattern":"^off_[0-9A-Za-z]{20}$"},"type":{"anyOf":[{"type":"string","enum":["hotel"]},{"type":"string"}]},"expiresAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"hotel":{"type":"object","properties":{"hotelId":{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},"room":{"type":"object","properties":{"name":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"beds":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"areaSqm":{"anyOf":[{"type":"object","properties":{"min":{"type":"number"},"max":{"type":"number"}},"required":["min","max"],"additionalProperties":{}},{"type":"null"}]},"maxOccupancy":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"window":{"anyOf":[{"anyOf":[{"type":"string","enum":["yes","no","partial"]},{"type":"string"}]},{"type":"null"}]}},"required":["name","beds","areaSqm","maxOccupancy","window"],"additionalProperties":{}},"roomCount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"meals":{"type":"object","properties":{"known":{"type":"boolean"},"included":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string","enum":["breakfast","lunch","dinner"]},{"type":"string"}]}},{"type":"null"}]},"unspecifiedMainMeals":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"allInclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"guestsCoveredPerRoom":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["known","included","unspecifiedMainMeals","allInclusive","guestsCoveredPerRoom","label"],"additionalProperties":{}}},"required":["hotelId","room","roomCount","meals"],"additionalProperties":{}},"price":{"type":"object","properties":{"total":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"perNightAllRooms":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"approx":{"anyOf":[{"type":"object","properties":{"total":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"perNightAllRooms":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},"rateDate":{"type":"string"}},"required":["total","perNightAllRooms","rateDate"],"additionalProperties":{}},{"type":"null"}]},"payAtProperty":{"type":"object","properties":{"disclosure":{"anyOf":[{"type":"string","enum":["complete","incomplete"]},{"type":"string"}]},"items":{"type":"array","items":{"type":"object","properties":{"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"amount":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]},"mandatory":{"type":"boolean"},"basis":{"anyOf":[{"type":"string","enum":["per_stay","per_night","per_person","per_person_per_night","unknown"]},{"type":"string"}]},"collectedAt":{"anyOf":[{"type":"string","enum":["property","unknown"]},{"type":"string"}]}},"required":["label","amount","mandatory","basis","collectedAt"],"additionalProperties":{}}}},"required":["disclosure","items"],"additionalProperties":{}}},"required":["total","perNightAllRooms","approx","payAtProperty"],"additionalProperties":{}},"cancellation":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["free","partial_penalty","non_refundable","unknown"]},{"type":"string"}]},"asOf":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"freeCancellationEndsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"penalties":{"type":"array","items":{"type":"object","properties":{"startsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"amount":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["startsAt","amount"],"additionalProperties":{}}},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["status","asOf","freeCancellationEndsAt","penalties","timeZone"],"additionalProperties":{}},"confirmation":{"type":"object","properties":{"mode":{"anyOf":[{"type":"string","enum":["instant","on_request","unknown"]},{"type":"string"}]},"withinMinutes":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["mode","withinMinutes"],"additionalProperties":{}}},"required":["offerId","type","expiresAt","hotel","price","cancellation","confirmation"],"additionalProperties":{}}},"required":["changes","offer"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"offer_already_ordered"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"}},"required":["orderId"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"order_exists"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"},"status":{"anyOf":[{"type":"string","enum":["awaiting_payment","expired","confirming","confirmed","failed","cancelling","cancelled","needs_attention"]},{"type":"string"}]}},"required":["orderId","status"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"order_in_progress"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"}},"required":["orderId"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"order_attempts_exhausted"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"}},"required":["orderId"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"cancellation_changed"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"order_not_cancellable"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"reason":{"anyOf":[{"type":"string","enum":["cancellable","already_cancelled","in_progress","not_confirmed","stay_started","non_refundable","refused","terms_unknown","needs_attention"]},{"type":"string"}]}},"required":["reason"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"order_not_payable"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"},"status":{"anyOf":[{"type":"string","enum":["awaiting_payment","expired","confirming","confirmed","failed","cancelling","cancelled","needs_attention"]},{"type":"string"}]}},"required":["orderId","status"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"payment_in_progress"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"}},"required":["orderId"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"payment_total_changed"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"},"total":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["orderId","total"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"payment_credential_invalid"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"reason":{"anyOf":[{"type":"string","enum":["not_found","currency","amount","expired","deactivated","used","other_seller"]},{"type":"string"}]}},"required":["reason"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"payment_declined"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"declineCode":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["declineCode"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"payment_action_required"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"payment_method_unavailable"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"destination_ambiguous"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"name":{"type":"string"},"countryCode":{"type":"string"},"candidates":{"type":"array","items":{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}},"kind":{"anyOf":[{"type":"string","enum":["country","region","district","settlement","neighbourhood","island"]},{"type":"string"}]},"scope":{"anyOf":[{"type":"string","enum":["area","radius"]},{"type":"string"}]},"cityLike":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"population":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"region":{"anyOf":[{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},{"type":"null"}]},"countryCode":{"type":"string"},"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":{}},"hotels":{"type":"object","properties":{"scope":{"anyOf":[{"type":"string","enum":["area","radius"]},{"type":"string"}]},"radiusMeters":{"anyOf":[{"type":"number"},{"type":"null"}]},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["scope","radiusMeters","count"],"additionalProperties":{}}},"required":["placeId","name","names","kind","scope","cityLike","population","region","countryCode","location","hotels"],"additionalProperties":{}}},"candidatesTotal":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"nameAsText":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["name","countryCode","candidates","candidatesTotal","nameAsText"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"destination_not_found"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"anyOf":[{"type":"object","properties":{"reason":{"type":"string","const":"no_match"},"name":{"type":"string"},"countryCode":{"type":"string"},"nameAsText":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["reason","name","countryCode","nameAsText"],"additionalProperties":{}},{"type":"object","properties":{"reason":{"type":"string","const":"unknown_id"},"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"}},"required":["reason","placeId"],"additionalProperties":{}},{"type":"object","properties":{"reason":{"type":"string","const":"not_a_locality"},"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"hub":{"anyOf":[{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},{"type":"null"}]},"hubTotal":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]}},"required":["reason","placeId","hub","hubTotal"],"additionalProperties":{}},{"type":"object","properties":{"reason":{"type":"string"}},"required":["reason"],"additionalProperties":{}}]},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"search_too_broad"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"matched":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"poolLimit":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"localities":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"place":{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"total":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"includes":{"type":"array","items":{"type":"object","properties":{"place":{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},"members":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["place","members"],"additionalProperties":{}}}},"required":["place","count","total","includes"],"additionalProperties":{}}},"unassigned":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"more":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["items","unassigned","more"],"additionalProperties":{}},"center":{"anyOf":[{"type":"object","properties":{"location":{"type":"object","properties":{"lat":{"type":"number"},"lng":{"type":"number"}},"required":["lat","lng"],"additionalProperties":{}},"place":{"anyOf":[{"type":"object","properties":{"placeId":{"type":"string","pattern":"^plc_\\d{1,12}$"},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}}},"required":["placeId","name","names"],"additionalProperties":{}},{"type":"null"}]},"basis":{"anyOf":[{"type":"string","enum":["seat","capital","busiest_settlement","hub","point"]},{"type":"string"}]}},"required":["location","place","basis"],"additionalProperties":{}},{"type":"null"}]}},"required":["matched","poolLimit","localities","center"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"stay_unsupported"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"anyOf":[{"type":"object","properties":{"reason":{"type":"string","const":"mixed_occupancy"}},"required":["reason"],"additionalProperties":{}},{"type":"object","properties":{"reason":{"type":"string","const":"max_nights"},"max":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["reason","max"],"additionalProperties":{}},{"type":"object","properties":{"reason":{"type":"string"}},"required":["reason"],"additionalProperties":{}}]},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"stay_in_past"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"checkIn":{"type":"string"},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["checkIn","timeZone"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"offer_unavailable"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"offerId":{"type":"string","pattern":"^off_[0-9A-Za-z]{20}$"},"reason":{"anyOf":[{"type":"string","enum":["sold_out","refused"]},{"type":"string"}]}},"required":["offerId","reason"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"rate_limited"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"scope":{"anyOf":[{"type":"string","enum":["search","offers","hotel","orders_read","orders_create","orders_cancel","orders_pay"]},{"type":"string"}]}},"required":["scope"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"ordering_paused"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"service_unavailable"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"supplier_unavailable"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"details":{"type":"object","properties":{"outcome":{"anyOf":[{"type":"string","enum":["not_started","unknown"]},{"type":"string"}]}},"required":["outcome"],"additionalProperties":{}},"requestId":{"type":"string"}},"required":["code","message","retryable","details","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string","const":"internal"},"message":{"type":"string"},"param":{"type":"string"},"retryable":{"type":"boolean"},"retryAfterSeconds":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"requestId":{"type":"string"}},"required":["code","message","retryable","requestId"],"additionalProperties":{}},{"type":"object","properties":{"code":{"type":"string"}},"required":["code"],"additionalProperties":{}}]}},"required":["error"],"additionalProperties":{}},"Order":{"type":"object","properties":{"orderId":{"type":"string","pattern":"^ord_[0-9A-Za-z]{20}$"},"reference":{"type":"string","pattern":"^FT-[2-9A-HJ-NP-Z]{6}$"},"status":{"anyOf":[{"type":"string","enum":["awaiting_payment","expired","confirming","confirmed","failed","cancelling","cancelled","needs_attention"]},{"type":"string"}]},"createdAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"updatedAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"items":{"minItems":1,"type":"array","items":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"hotel"},"hotel":{"type":"object","properties":{"hotelId":{"anyOf":[{"type":"string","pattern":"^htl_[0-9A-Za-z]{20}$"},{"type":"null"}]},"name":{"type":"string"},"names":{"type":"object","properties":{"en":{"anyOf":[{"type":"string"},{"type":"null"}]},"zh":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["en","zh"],"additionalProperties":{}},"checkIn":{"type":"string"},"checkOut":{"type":"string"},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]},"rooms":{"minItems":1,"type":"array","items":{"type":"object","properties":{"adults":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"childrenAges":{"type":"array","items":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}}},"required":["adults","childrenAges"],"additionalProperties":{}}},"room":{"type":"object","properties":{"name":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"beds":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["name","beds"],"additionalProperties":{}},"meals":{"type":"object","properties":{"known":{"type":"boolean"},"included":{"anyOf":[{"type":"array","items":{"anyOf":[{"type":"string","enum":["breakfast","lunch","dinner"]},{"type":"string"}]}},{"type":"null"}]},"unspecifiedMainMeals":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"allInclusive":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"guestsCoveredPerRoom":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]}},"required":["known","included","unspecifiedMainMeals","allInclusive","guestsCoveredPerRoom","label"],"additionalProperties":{}},"cancellation":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["free","partial_penalty","non_refundable","unknown"]},{"type":"string"}]},"asOf":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},"freeCancellationEndsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"penalties":{"type":"array","items":{"type":"object","properties":{"startsAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"amount":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["startsAt","amount"],"additionalProperties":{}}},"timeZone":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["status","asOf","freeCancellationEndsAt","penalties","timeZone"],"additionalProperties":{}},"payAtProperty":{"type":"object","properties":{"disclosure":{"anyOf":[{"type":"string","enum":["complete","incomplete"]},{"type":"string"}]},"items":{"type":"array","items":{"type":"object","properties":{"label":{"anyOf":[{"type":"object","properties":{"text":{"type":"string"},"locale":{"anyOf":[{"anyOf":[{"type":"string","enum":["en","zh"]},{"type":"string"}]},{"type":"null"}]}},"required":["text","locale"],"additionalProperties":{}},{"type":"null"}]},"amount":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]},"mandatory":{"type":"boolean"},"basis":{"anyOf":[{"type":"string","enum":["per_stay","per_night","per_person","per_person_per_night","unknown"]},{"type":"string"}]},"collectedAt":{"anyOf":[{"type":"string","enum":["property","unknown"]},{"type":"string"}]}},"required":["label","amount","mandatory","basis","collectedAt"],"additionalProperties":{}}}},"required":["disclosure","items"],"additionalProperties":{}},"confirmationNumber":{"anyOf":[{"type":"string"},{"type":"null"}]}},"required":["hotelId","name","names","checkIn","checkOut","timeZone","rooms","room","meals","cancellation","payAtProperty","confirmationNumber"],"additionalProperties":{}}},"required":["type","hotel"],"additionalProperties":{}},{"type":"object","properties":{"type":{"type":"string"}},"required":["type"],"additionalProperties":{}}]}},"price":{"type":"object","properties":{"total":{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}}},"required":["total"],"additionalProperties":{}},"payment":{"type":"object","properties":{"status":{"anyOf":[{"type":"string","enum":["unpaid","authorized","paid","released","refund_pending","refunded"]},{"type":"string"}]},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The payment page, on fortrip.ai. With requiresSignIn false it continues to Stripe Checkout, and anyone holding it can pay; with requiresSignIn true (an order started on the Fortrip website) it continues to the Fortrip booking page, where only the signed-in owner can pay. null when the order isn't awaiting payment, or, while it is, when the link couldn't be read this time: read the order again."},"requiresSignIn":{"type":"boolean"},"expiresAt":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$"},{"type":"null"}]},"chargeCurrency":{"type":"string"},"localCurrencyAtCheckout":{"type":"boolean"},"localCharge":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}]},"handlers":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"type":{"type":"string"},"version":{"type":"string"},"spec":{"type":"string"},"schema":{"type":"string"},"available_instruments":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string"},"config":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["type"],"additionalProperties":{}}},"config":{"type":"object","properties":{"environment":{"anyOf":[{"type":"string","enum":["livemode","testmode"]},{"type":"string"}]},"business_profile":{"type":"string"}},"required":["environment","business_profile"],"additionalProperties":{}}},"required":["id","type","version","spec","schema","available_instruments","config"],"additionalProperties":{}},"description":"The ways to pay other than url: a com.stripe.payments handler takes a Stripe shared payment token through pay_order. [] when a token can't pay the order: over $500, not charged in USD, an order started on the Fortrip website, a negotiated price, under 15 minutes left, 5 tokens tried, a token payment is under way, or token payment isn't offered for this order."},"credentialLimits":{"anyOf":[{"type":"object","properties":{"maxAmount":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991,"description":"Request the token for at least this amount, in cents; a token that allows less can't pay."},"currency":{"type":"string","description":"The token's currency, lowercase as Stripe takes it: usd."},"expiresAt":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}T(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?Z$","description":"Request the token valid until at least this time; the order can't be paid after it."}},"required":["maxAmount","currency","expiresAt"],"additionalProperties":{}},{"type":"null"}],"description":"What the shared payment token for pay_order must allow. null exactly when handlers is []."},"wallets":{"anyOf":[{"type":"object","properties":{"open":{"type":"boolean","description":"Whether pay_order has opened a wallet payment on this order."},"current":{"anyOf":[{"anyOf":[{"type":"string","enum":["wechat_pay","alipay"]},{"type":"string"}]},{"type":"null"}],"description":"The wallet the payment is on now; null until it is open."},"wechatPay":{"anyOf":[{"type":"object","properties":{"qrData":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"The WeChat Pay code's content, to draw as a QR code; null when there is no live code (open wechatPay.url for one)."},"qrImageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"A 480 px PNG of the same code."},"url":{"type":"string","description":"A link, on fortrip.ai, for the user to pay with WeChat Pay; anyone holding it can pay."}},"required":["qrData","qrImageUrl","url"],"additionalProperties":{}},{"type":"null"}],"description":"The WeChat Pay code and link; null until the payment is open."},"alipay":{"anyOf":[{"type":"object","properties":{"url":{"type":"string","description":"A link, on fortrip.ai, for the user to pay with Alipay; anyone holding it can pay."}},"required":["url"],"additionalProperties":{}},{"type":"null"}],"description":"The Alipay link; null until the payment is open."}},"required":["open","current","wechatPay","alipay"],"additionalProperties":{}},{"type":"null"}],"description":"Paying with Alipay or WeChat Pay: pass method alipay_wechat_pay to pay_order to open it. null when the order can't be paid this way and none is open."}},"required":["status","url","requiresSignIn","expiresAt","chargeCurrency","localCurrencyAtCheckout","localCharge","handlers","credentialLimits","wallets"],"additionalProperties":{}},"cancel":{"type":"object","properties":{"available":{"type":"boolean","description":"Whether the user can cancel the order now."},"reason":{"anyOf":[{"type":"string","enum":["cancellable","already_cancelled","in_progress","not_confirmed","stay_started","non_refundable","refused","terms_unknown","needs_attention"]},{"type":"string"}],"description":"cancellable when it can be cancelled now; otherwise why not."},"penalty":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}],"description":"The penalty if cancelled now, under the accepted terms, in the charge currency; null when not stated."},"refund":{"anyOf":[{"type":"object","properties":{"amount":{"type":"string","pattern":"^\\d+(\\.\\d+)?$"},"currency":{"type":"string","pattern":"^[A-Z]{3}$"}},"required":["amount","currency"],"additionalProperties":{}},{"type":"null"}],"description":"What a cancellation now refunds: what was paid less the penalty, in the charge currency; null when not stated."}},"required":["available","reason","penalty","refund"],"additionalProperties":{},"description":"Whether the order can be cancelled now, and for what penalty and refund."},"manageUrl":{"type":"string"}},"required":["orderId","reference","status","createdAt","updatedAt","items","price","payment","cancel","manageUrl"],"additionalProperties":{}}},"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"A Fortrip OAuth access token from the device authorization flow (RFC 8628). `GET /v1/auth/config` returns the flow's endpoints."}}}}