Fortrip
HTTP APIReference

Live offers

Live, bookable offers for up to 15 hotels and one stay.

The full rules agents follow for this call are on its MCP tool's page, get_hotel_offers.

POST
/v1/hotels/offers

Authorization

bearerAuth
headerAuthorizationBearer <token>

A Fortrip OAuth access token from the device authorization flow (RFC 8628). GET /v1/auth/config returns the flow's endpoints.

Request Body

application/json
  1. body
hotelIds*array<>

Hotels to price, 1 to 15, no repeats.

Items1 <= items <= 15
stay*

Dates and party. One party per call: every room must be the same.

filters?

Filters every offer must pass.

limitPerHotel?integer

Offers per hotel, 1 to 20. Default 10.

Range1 <= value <= 20
Default10
locale?string

Language for names and text in the response: en or zh.

Value in"en""zh"
displayCurrency?string

Currency to show prices in, USD or CNY. It never changes what is charged: payment is in USD.

Value in"USD""CNY"

Response Body

Live offers

application/json
  1. response
stay*
hotels*array<>
unavailable*array<>
[key: string]?unknown
Example Request
curl -X POST 'https://api.fortrip.ai/v1/hotels/offers' \  -H 'Content-Type: application/json' \  -d '{  "hotelIds": [    "string"  ],  "stay": {    "checkIn": "string",    "checkOut": "string",    "rooms": [      {        "adults": 1,        "childrenAges": [          0        ]      }    ]  }}'
Example Response
{  "stay": {    "checkIn": "string",    "checkOut": "string",    "rooms": [      {        "adults": -9007199254740991,        "childrenAges": [          -9007199254740991        ],        "property1": null,        "property2": null      }    ],    "property1": null,    "property2": null  },  "hotels": [    {      "hotel": {        "hotelId": "string",        "name": "string",        "names": {          "en": "string",          "zh": "string",          "property1": null,          "property2": null        },        "property1": null,        "property2": null      },      "offers": [        {          "offerId": "string",          "type": "hotel",          "expiresAt": "string",          "hotel": {            "hotelId": "string",            "room": {              "name": {                "text": "string",                "locale": "en",                "property1": null,                "property2": null              },              "beds": {                "text": "string",                "locale": "en",                "property1": null,                "property2": null              },              "areaSqm": {                "min": 0,                "max": 0,                "property1": null,                "property2": null              },              "maxOccupancy": -9007199254740991,              "window": "yes",              "property1": null,              "property2": null            },            "roomCount": -9007199254740991,            "meals": {              "known": true,              "included": [                "breakfast"              ],              "unspecifiedMainMeals": -9007199254740991,              "allInclusive": true,              "guestsCoveredPerRoom": -9007199254740991,              "label": {                "text": "string",                "locale": "en",                "property1": null,                "property2": null              },              "property1": null,              "property2": null            },            "property1": null,            "property2": null          },          "price": {            "total": {              "amount": "string",              "currency": "string",              "property1": null,              "property2": null            },            "perNightAllRooms": {              "amount": "string",              "currency": "string",              "property1": null,              "property2": null            },            "approx": {              "total": {                "amount": "string",                "currency": "string",                "property1": null,                "property2": null              },              "perNightAllRooms": {                "amount": "string",                "currency": "string",                "property1": null,                "property2": null              },              "rateDate": "string",              "property1": null,              "property2": null            },            "payAtProperty": {              "disclosure": "complete",              "items": [                {                  "label": {                    "text": "string",                    "locale": "en",                    "property1": null,                    "property2": null                  },                  "amount": {                    "amount": "string",                    "currency": "string",                    "property1": null,                    "property2": null                  },                  "mandatory": true,                  "basis": "per_stay",                  "collectedAt": "property",                  "property1": null,                  "property2": null                }              ],              "property1": null,              "property2": null            },            "property1": null,            "property2": null          },          "cancellation": {            "status": "free",            "asOf": "string",            "freeCancellationEndsAt": "string",            "penalties": [              {                "startsAt": "string",                "amount": {                  "amount": "string",                  "currency": "string",                  "property1": null,                  "property2": null                },                "property1": null,                "property2": null              }            ],            "timeZone": "string",            "property1": null,            "property2": null          },          "confirmation": {            "mode": "instant",            "withinMinutes": -9007199254740991,            "property1": null,            "property2": null          },          "property1": null,          "property2": null        }      ],      "omitted": {        "byNationality": -9007199254740991,        "byFilters": -9007199254740991,        "dominated": -9007199254740991,        "unreadable": -9007199254740991,        "byLimit": -9007199254740991,        "property1": null,        "property2": null      },      "property1": null,      "property2": null    }  ],  "unavailable": [    {      "hotelId": "string",      "reason": "sold_out",      "omitted": {        "byNationality": -9007199254740991,        "byFilters": -9007199254740991,        "dominated": -9007199254740991,        "unreadable": -9007199254740991,        "byLimit": -9007199254740991,        "property1": null,        "property2": null      },      "property1": null,      "property2": null    }  ],  "property1": null,  "property2": null}