Reference
Response schemas
The CLI prints these objects on stdout. MCP tools return them as structuredContent. Fields marked optional can be absent; a type with null means the value can be null.
Search result
From fortrip search and search_hotels. A hotel is listed only when every night has a price.
{
"checkIn": "2026-11-10",
"checkOut": "2026-11-12",
"nights": 2,
"currency": "CNY",
"fx": null,
"hotels": [
{
"hotelId": 266000,
"name": "曼谷安纳塔拉河畔度假酒店",
"nameEn": "Anantara Riverside Bangkok Resort",
"starLevel": 5,
"cityCode": 904976,
"cityNameEn": "Bangkok",
"price": {
"totalFrom": 3160.61,
"nightlyFrom": 1580.31,
"nightly": [{ "date": "2026-11-10", "price": 1459.47 }, ...]
},
...
}
],
"pagination": { "page": 1, "pageSize": 20, "total": 2571 },
"coverage": { "matched": 3581, "candidates": 3581, "priced": 2571 }
}checkInstringCheck-in date, yyyy-MM-dd.
checkOutstringCheck-out date, yyyy-MM-dd.
nightsnumberNights in the stay.
currency"CNY" | "USD"Currency of every price in the response.
fxobject | nullHow prices were converted to currency. null when no conversion was needed.
fx.fromstringCurrency the prices were quoted in.
fx.ratenumberUnits of currency per unit of from.
fx.source"stripe" | "fallback"stripe: Stripe's live rate. fallback: a fixed rate, used when Stripe could not quote.
hotelsobject[]Hotels with a price for every night. Prices are indicative; quote live rates before booking.
hotels[].hotelIdnumberHotel id. Pass it to hotel details, rates and booking.
hotels[].resourceHotelIdstringCatalogue record id. Not used by other calls.
hotels[].namestringHotel name, often in Chinese.
hotels[].nameEnstring | nullHotel name in English.
hotels[].starLevelnumberStar rating, 0–5.
hotels[].countryNamestringCountry.
hotels[].countryNameEnstring | nullCountry in English.
hotels[].cityCodenumberCatalogue city code. Use it as cityCode in search.
hotels[].cityNamestringCity.
hotels[].cityNameEnstring | nullCity in English.
hotels[].addressstringAddress.
hotels[].addressEnstring | nullAddress in English.
hotels[].latitudenumber | nullLatitude (WGS 84).
hotels[].longitudenumber | nullLongitude (WGS 84).
hotels[].distanceMetersnumberoptionalDistance from near. Present only when searching with near.
hotels[].priceobjectIndicative price for the stay.
hotels[].price.totalFromnumberSum of the nightly prices.
hotels[].price.nightlyFromnumbertotalFrom divided by nights.
hotels[].price.nightlyobject[]Lowest price for each night.
hotels[].price.nightly[].datestringNight, yyyy-MM-dd.
hotels[].price.nightly[].pricenumberPrice for the night.
paginationobjectPaging.
pagination.pagenumberCurrent page.
pagination.pageSizenumberHotels per page.
pagination.totalnumberHotels after price filters.
coverageobjectHow many hotels the search matched and priced.
coverage.matchednumberHotels matching the query and filters.
coverage.candidatesnumberMatches that could be priced.
coverage.pricednumberCandidates with a price for every night, before price filters.
Hotel details
From fortrip hotel and get_hotel. About 8–10 KB per hotel. Unknown values are null.
hotelIdnumberHotel id.
resourceHotelIdstringCatalogue record id.
namestringHotel name, often in Chinese.
nameEnstring | nullHotel name in English.
starLevelnumber | nullStar rating, 0–5.
brandstring | nullBrand.
countrystring | nullCountry.
provincestring | nullProvince or state.
citystring | nullCity.
districtstring | nullDistrict.
addressstring | nullAddress.
addressEnstring | nullAddress in English.
latitudenumber | nullLatitude. GCJ-02 in mainland China, about 500 m off WGS 84.
longitudenumber | nullLongitude.
telephonestring | nullPhone number.
websitestring | nullWebsite.
openedOnstring | nullOpening date.
renovatedOnstring | nullLast renovation date.
floorsnumber | nullFloors.
totalRoomsnumber | nullRooms in the hotel.
introstring | nullDescription.
introEnstring | nullDescription in English.
checkInobjectCheck-in window, "HH:mm".
checkIn.fromstring | nullEarliest check-in.
checkIn.tostring | nullLatest check-in.
checkOutobjectCheck-out window, "HH:mm".
checkOut.fromstring | nullEarliest check-out.
checkOut.tostring | nullLatest check-out.
breakfastServiceboolean | nullThe hotel serves breakfast. Says nothing about whether a rate includes it.
depositobjectDeposit taken at the hotel.
deposit.requiredboolean | nullWhether a deposit is required.
deposit.amountnumber | nullDeposit amount.
deposit.currencystring | nullDeposit currency.
policiesobject[]Hotel policies. Only topics with text are returned.
policies[].topicstringcheckIn, importantNotices, booking, bookingTips, checkInOut, checkInTips, reception, deposit, meal, extraBed, pets, surroundings, meetings or nonSmoking.
policies[].zhstring | nullPolicy text in Chinese.
policies[].enstring | nullPolicy text in English.
facilitiesobject[]Facilities. These names work as facilities in search.
facilities[].namestringFacility name.
facilities[].nameEnstring | nullFacility name in English.
photosobject[]Up to 8 hotel photos.
photos[].urlstringHTTPS image URL. Treat it as opaque; it may go through Fortrip's image proxy.
photos[].titlestring | nullCaption.
roomsobject[]optionalCatalogue rooms. Present only with includeRooms / --with-rooms.
rooms[].roomIdstring | nullRoom id, matching rooms[].roomId in rates. null when it has no match.
rooms[].namestring | nullRoom name.
rooms[].nameEnstring | nullRoom name in English.
rooms[].areaMinnumber | nullSmallest area, m².
rooms[].areaMaxnumber | nullLargest area, m².
rooms[].floorMinnumber | nullLowest floor.
rooms[].floorMaxnumber | nullHighest floor.
rooms[].window"No window" | "Window" | "Partial window" | nullWindow type.
rooms[].maxOccupancynumber | nullMost guests the room sleeps.
rooms[].bedsstring | nullBed setup, e.g. "1 King Bed".
rooms[].nonSmokingboolean | nullNon-smoking room.
rooms[].extraBedFeenumber | nullExtra bed fee.
rooms[].extraBedFeeCurrencystring | nullCurrency of extraBedFee.
rooms[].standardRoombooleanStandardised room type.
Rates result
From fortrip rates and get_rates. Prices are converted and rounded up to the cent one by one, so the nightly prices can add up to a few cents more or less than totalPrice.
checkInstringCheck-in date, yyyy-MM-dd.
checkOutstringCheck-out date, yyyy-MM-dd.
currency"CNY" | "USD"Currency of every price except fees.
fxobject | nullHow prices were converted to currency. null when no conversion was needed.
fx.fromstringCurrency the prices were quoted in.
fx.ratenumberUnits of currency per unit of from.
fx.source"stripe" | "fallback"stripe: Stripe's live rate. fallback: a fixed rate, used when Stripe could not quote.
hotelsobject[]One entry per hotel with live rates.
hotels[].hotelIdnumberHotel id.
hotels[].namestringoptionalHotel name.
hotels[].nameEnstringoptionalHotel name in English.
hotels[].roomsobject[]Cheapest rooms first, up to maxRoomsPerHotel.
hotels[].rooms[].roomIdstringRoom id. Pass it to booking.
hotels[].rooms[].namestringoptionalRoom name.
hotels[].rooms[].nameEnstringoptionalRoom name in English.
hotels[].rooms[].ratesobject[]The cheapest rate for each meal plan × free-cancellation option, cheapest first.
hotels[].rooms[].rates[].ratePlanCodestringRate id. Pass it to booking.
hotels[].rooms[].rates[].boardCodestringMeal plan: RO, BB, HB, FB, BL, BD, HBBL, HBLD or AI.
hotels[].rooms[].rates[].boardCountnumberGuests per room the meal plan covers. Fewer than adults per room means the meals don't cover everyone.
hotels[].rooms[].rates[].adultsnumberAdults per room.
hotels[].rooms[].rates[].childrenAgesnumber[]optionalChildren's ages.
hotels[].rooms[].rates[].isInstantConfirmbooleanConfirmed instantly after payment.
hotels[].rooms[].rates[].confirmByMinsnumber | nulloptionalMinutes the hotel takes to confirm, when not instant.
hotels[].rooms[].rates[].totalPricenumberTotal for the stay, in currency. Compare this, not the sum of dailyPrices.
hotels[].rooms[].rates[].dailyPricesobject[]Price per night.
hotels[].rooms[].rates[].dailyPrices[].datestringNight, yyyy-MM-dd.
hotels[].rooms[].rates[].dailyPrices[].pricenumberPrice per room for the night.
hotels[].rooms[].rates[].dailyPrices[].status0 | 11 bookable, 0 not bookable.
hotels[].rooms[].rates[].nationalityRule1 | 2optional1: only nationalityCodes may book. 2: everyone except them.
hotels[].rooms[].rates[].nationalityCodesstring[]optionalCountry codes for nationalityRule.
hotels[].rooms[].rates[].cancellationPoliciesobject[]optionalCancellation fee steps.
hotels[].rooms[].rates[].cancellationPolicies[].amountnumberFee if cancelled from from on.
hotels[].rooms[].rates[].cancellationPolicies[].fromstringISO 8601 date-time the fee starts.
hotels[].rooms[].rates[].feesobject[]optionalFees paid at the hotel, in their own currency.
hotels[].rooms[].rates[].fees[].typestringFee type, e.g. ResortFee.
hotels[].rooms[].rates[].fees[].isMandatorybooleanWhether the hotel always charges it.
hotels[].rooms[].rates[].fees[].amountnumberAmount, in the fee's own currency.
hotels[].rooms[].rates[].fees[].currencystringCurrency of amount.
hotels[].rooms[].rates[].refundablebooleanCan be cancelled for a refund.
hotels[].rooms[].rates[].freeCancelUntilstring | nullFree cancellation ends at this ISO 8601 date-time.
hotels[].rooms[].rates[].freeCancellationbooleanCan still be cancelled free of charge right now.
hotels[].rooms[].staticobject | nullCatalogue facts for the room. null when the catalogue has none.
hotels[].rooms[].static.catalogueRoomIdstringCatalogue room id.
hotels[].rooms[].static.namestring | nullRoom name.
hotels[].rooms[].static.nameEnstring | nullRoom name in English.
hotels[].rooms[].static.areaMinnumber | nullSmallest area, m².
hotels[].rooms[].static.areaMaxnumber | nullLargest area, m².
hotels[].rooms[].static.floorMinnumber | nullLowest floor.
hotels[].rooms[].static.floorMaxnumber | nullHighest floor.
hotels[].rooms[].static.window"No window" | "Window" | "Partial window" | nullWindow type.
hotels[].rooms[].static.maxOccupancynumber | nullMost guests the room sleeps.
hotels[].rooms[].static.bedsstring | nullBed setup, e.g. "1 King Bed".
hotels[].rooms[].static.nonSmokingboolean | nullNon-smoking room.
hotels[].rooms[].static.extraBedFeenumber | nullExtra bed fee.
hotels[].rooms[].static.extraBedFeeCurrencystring | nullCurrency of extraBedFee.
hotels[].rooms[].static.standardRoombooleanStandardised room type.
hotels[].rooms[].static.photosstring[]Up to 3 HTTPS photo URLs. Often empty.
hotels[].coverageobjectRoom and rate counts before and after filtering.
hotels[].coverage.roomsnumberRooms offered.
hotels[].coverage.ratesnumberRates offered.
hotels[].coverage.matchedRoomsnumberRooms left after filters.
hotels[].coverage.matchedRatesnumberRates left after filters.
hotels[].coverage.returnedRoomsnumberRooms returned.
hotels[].coverage.returnedRatesnumberRates returned.
Booking result
From fortrip book and create_booking. Show the user the amount, currency, the stay and every item in terms, and ask them to confirm before you share paymentUrl.
{
"agentOrderId": "c451cff9324ee6f7eaafda5d39aff423",
"paymentUrl": "https://fortrip.ai/booking-status?session_id=cs_...",
"amount": 372.78,
"currency": "USD",
"orderUrl": "https://fortrip.ai/orders/c451...",
"statusUrl": "https://fortrip.ai/booking-status?session_id=cs_...",
"stay": {
"hotelId": 266000,
"hotelName": "Anantara Riverside Bangkok Resort",
"roomName": "Deluxe Room",
"checkIn": "2026-11-10",
"checkOut": "2026-11-12",
"nights": 2,
"rooms": 1,
"adultsPerRoom": 2,
"childrenAgesPerRoom": []
},
"terms": {
"boardCode": "BB",
"boardCount": 2,
"refundable": true,
"freeCancelUntil": "2026-11-09T12:00:00.000+07:00",
"cancellation": [{ "amount": 372.78, "from": "2026-11-09T12:00:00.000+07:00" }],
"isInstantConfirm": true,
"confirmByMins": null,
"payAtHotelFees": [{ "type": "ResortFee", "isMandatory": true, "amount": 30, "currency": "THB" }]
}
}agentOrderIdstringOrder id. The same user and stay always get the same order.
paymentUrlstringFortrip page that recaps the booking and continues to payment. Anyone holding it can pay, so share it only with the user. Valid for about 3 h 45 min.
amountnumber | nullAmount charged. null only when the order can't be read back.
currencystringCurrency charged, usually USD. May differ from the currency shown by rates.
orderUrlstringOrder page on fortrip.ai. Requires sign-in.
statusUrlstringoptionalPublic booking status page, the same page as paymentUrl. No sign-in needed.
stayobjectThe stay as the order recorded it. Read it back to the user with the terms. Every room has the same occupancy.
stay.hotelIdnumberHotel id.
stay.hotelNamestring | nullEnglish name, or the Chinese name when there is none.
stay.roomNamestring | nullRoom name.
stay.checkInstringyyyy-MM-dd.
stay.checkOutstringyyyy-MM-dd.
stay.nightsnumberNights in the stay.
stay.roomsnumberRooms booked.
stay.adultsPerRoomnumberAdults in each room.
stay.childrenAgesPerRoomnumber[]Children's ages in each room.
termsobject | nullThe terms the user accepts by paying. Show them before sharing paymentUrl. null only when the order can't be read back.
terms.boardCodestringMeal plan.
terms.boardCountnumberGuests per room the meal plan covers.
terms.refundablebooleanCan be cancelled for a refund.
terms.freeCancelUntilstring | nullFree cancellation ends at this ISO 8601 date-time.
terms.cancellationobject[]Cancellation fee steps.
terms.cancellation[].amountnumberFee if cancelled from from on.
terms.cancellation[].fromstringISO 8601 date-time the fee starts.
terms.isInstantConfirmbooleanConfirmed instantly after payment.
terms.confirmByMinsnumber | nullMinutes to confirm, when not instant.
terms.payAtHotelFeesobject[]Fees paid at the hotel.
terms.payAtHotelFees[].typestringFee type, e.g. ResortFee.
terms.payAtHotelFees[].isMandatorybooleanWhether the hotel always charges it.
terms.payAtHotelFees[].amountnumberAmount, in the fee's own currency.
terms.payAtHotelFees[].currencystringCurrency of amount.
nextStepstringoptionalMCP only. Reminds the model to confirm the terms with the user first.
The amount charged is in the booking's own currency, usually USD, and can differ from the CNY or USD figure shown by rates. Calling again for the same stay returns the same link while it is valid, or a new one when the price or terms changed. See Errors & limits for the 409 and 422 cases.