Engine MCP

Engine MCP — Tools for cursor

The tools Engine's MCP server offers to cursor. An assistant invokes a tool through the MCP protocol's tools/call request, passing the arguments listed against it.

Generated from Engine's tool registry.

MCP endpoint https://mcp.engine.com/mcp

Tools 16 tools

DESTRUCTIVE lodging_book_cart Places the booking with a saved payment method.

Destructive — can delete data or make irreversible changes.

Places the booking with a saved payment method. Money moves. Books only for the signed-in member; never ask the user for a guest name or who is traveling. Only call after the user has seen the total and cancellation terms and explicitly said yes (userConfirmed). Waits for Engine's result: confirmed returns lodgingBookingNumber and an itinerary link. Every other answer is an error with _handoff links: not booked (failed, under review, needs verification or direct bill), or it may already be booked (booking_outcome_unknown, booking_in_progress, booking_rejected, cart_not_open; never call again, the user checks trips first). Do not call again after an answer unless the error says nothing was sent and its message allows it (total_changed, booking_cancelled, or a direct-bill refusal offering a card), and then only after the user confirms the total and payment again. Never create a new cart to retry the same stay unless the error is cart_expired; otherwise give the user the _handoff links.

Arguments

NameDescription
cartId* required
integer

cart.id from lodging_create_cart

  • maximum: 999999999999
paymentProfileId* required
integer | string

A method id from lodging_list_payment_methods

paymentType
string
  • Available values: "card", "direct_bill"
  • Default: "card"
confirmedTotal* required
number

The cart total you showed the user and they said yes to: summary.totalAmount from lodging_create_cart or cartTotal.amount from lodging_list_payment_methods

propertyId* required
integer

for the _handoff link on failure

  • maximum: 999999999999
userConfirmed* required
boolean

The user said yes to this exact cart and total.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "cartId": 0,
      "paymentProfileId": 0,
      "paymentType": "card",
      "confirmedTotal": 0,
      "propertyId": 0,
      "userConfirmed": true
    },
    "name": "lodging_book_cart"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "cartId": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 999999999999,
      "description": "`cart.id` from `lodging_create_cart`"
    },
    "paymentProfileId": {
      "anyOf": [
        {
          "type": "integer",
          "exclusiveMinimum": 0,
          "maximum": 999999999999
        },
        {
          "type": "string",
          "const": "direct_bill"
        }
      ],
      "description": "A method id from `lodging_list_payment_methods`"
    },
    "paymentType": {
      "default": "card",
      "type": "string",
      "enum": [
        "card",
        "direct_bill"
      ]
    },
    "confirmedTotal": {
      "type": "number",
      "exclusiveMinimum": 0,
      "description": "The cart total you showed the user and they said yes to: `summary.totalAmount` from `lodging_create_cart` or `cartTotal.amount` from `lodging_list_payment_methods`"
    },
    "propertyId": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 999999999999,
      "description": "for the `_handoff` link on failure"
    },
    "userConfirmed": {
      "type": "boolean",
      "const": true,
      "description": "The user said yes to this exact cart and total."
    }
  },
  "required": [
    "cartId",
    "paymentProfileId",
    "confirmedTotal",
    "propertyId",
    "userConfirmed"
  ],
  "additionalProperties": false
}

Returns

{
  "data": {
    "state": "confirmed",
    "cartId": 0,
    "tripNumber": "string",
    "lodgingBookingNumber": "string",
    "propertyConfirmationNumber": "string",
    "summary": {
      "cartId": 0,
      "status": "string",
      "checkIn": "string",
      "checkOut": "string",
      "rateDescription": "string",
      "total": "string",
      "totalAmount": 0,
      "dueAtProperty": "string"
    },
    "traveler": {
      "firstName": "string",
      "lastName": "string"
    }
  },
  "_links": {
    "*": {
      "tool": "string",
      "href": "string",
      "method": "GET",
      "description": "string",
      "body": {
        "*": null
      },
      "required": [
        "string"
      ]
    }
  },
  "_handoff": {
    "itinerary": {
      "href": "string",
      "description": "string"
    }
  }
}
{
data*object
{…}
{
state*string
cartId*integer
tripNumber*string | null
lodgingBookingNumber*string
propertyConfirmationNumber*string | null
summary*object
{…}
{
cartId*integer
status*string
checkIn*string | null
checkOut*string | null
rateDescription*string | null
total*string | null
totalAmount*number | null
dueAtPropertystring
}
traveler*object
{…}
{
firstName*string
lastName*string
}
}
_links*object
{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
_handoff*object
{…}
{
itinerary*object
{…}
{
href*string
description*string
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "state": {
          "type": "string",
          "const": "confirmed"
        },
        "cartId": {
          "type": "integer"
        },
        "tripNumber": {
          "type": [
            "string",
            "null"
          ]
        },
        "lodgingBookingNumber": {
          "type": "string"
        },
        "propertyConfirmationNumber": {
          "type": [
            "string",
            "null"
          ]
        },
        "summary": {
          "type": "object",
          "properties": {
            "cartId": {
              "type": "integer"
            },
            "status": {
              "type": "string"
            },
            "checkIn": {
              "type": [
                "string",
                "null"
              ]
            },
            "checkOut": {
              "type": [
                "string",
                "null"
              ]
            },
            "rateDescription": {
              "type": [
                "string",
                "null"
              ]
            },
            "total": {
              "type": [
                "string",
                "null"
              ]
            },
            "totalAmount": {
              "type": [
                "number",
                "null"
              ]
            },
            "dueAtProperty": {
              "type": "string"
            }
          },
          "required": [
            "cartId",
            "status",
            "checkIn",
            "checkOut",
            "rateDescription",
            "total",
            "totalAmount"
          ],
          "additionalProperties": false
        },
        "traveler": {
          "type": "object",
          "properties": {
            "firstName": {
              "type": "string"
            },
            "lastName": {
              "type": "string"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "state",
        "cartId",
        "tripNumber",
        "lodgingBookingNumber",
        "propertyConfirmationNumber",
        "summary",
        "traveler"
      ],
      "additionalProperties": false
    },
    "_links": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "tool": {
            "type": "string"
          },
          "href": {
            "type": "string"
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "POST"
            ]
          },
          "description": {
            "type": "string"
          },
          "body": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "required": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "href",
          "method",
          "description"
        ],
        "additionalProperties": false
      }
    },
    "_handoff": {
      "type": "object",
      "properties": {
        "itinerary": {
          "type": "object",
          "properties": {
            "href": {
              "type": "string"
            },
            "description": {
              "type": "string"
            }
          },
          "required": [
            "href",
            "description"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "itinerary"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "data",
    "_links",
    "_handoff"
  ],
  "additionalProperties": false
}
WRITE lodging_create_cart Locks a selected rate into a priced cart: totals, taxes, cancellation terms.

Write — creates or changes data.

Locks a selected rate into a priced cart: totals, taxes, cancellation terms. Books only for the signed-in member; never ask the user for a guest name or who is traveling. Follow the chosen rate's _links.lodging_create_cart link: pass rateToken exactly as returned (may be a short reference) and send rate, roomTitle, and the searched criteria unchanged (guestCount and roomCount included). A requires_approval, blocked, or not-bookable rate has no such link, only a _handoff: give the user that link instead of calling. When the chosen rate has the link, call this as soon as the user picks it, even if the rates response was saved to a file or the token is long: copy that rate's link body from the file. Never report a blocker before calling; it charges nothing, and a bad body returns an error that says what to do next. Returns either a cart (proceed to lodging_book_cart) or a _handoff when the agent cannot finish. More than one room or guest, or custom booking fields the company requires, still create the cart and hand off to its checkout page in Engine; a rate that needs approval or that policy blocks hands off with no cart. If the price changed, this fails: call lodging_get_room_rates again and show the new price.

Arguments

NameDescription
propertyId* required
integer
  • maximum: 999999999999
rateToken* required
string

From the rate's lodging_create_cart link; pass exactly as returned (may be a short reference)

rate* required
object

From the rate's lodging_create_cart link; send it unchanged

{…}
{
id*integer
searchId*number
sapiRateIdstring | null
outOfPolicy*boolean
violationsobject | null
}
roomTitle* required
string
roomDescription
string
criteria* required
object

The lodging_get_room_rates criteria, prefilled in the link

{…}
{
latitude*number
longitude*number
locationDescription*string
checkIn*string

YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing.

  • pattern: "^\\d{4}-\\d{2}-\\d{2}$"
checkOut*string

YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing.

  • pattern: "^\\d{4}-\\d{2}-\\d{2}$"
roomCount*integer

Use 1 unless the user asks for more rooms. Do not ask.

  • minimum: 1
  • maximum: 8
guestCount*integer

Use 1 unless the user mentions other people. Do not ask.

  • minimum: 1
  • maximum: 14
radiusMilesnumber
  • maximum: 50
locationKindstring

place.locationKind from lodging_resolve_destination; address searches show distance. Omit when unknown.

  • Available values: "address", "area"
}
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "propertyId": 0,
      "rateToken": "string",
      "rate": {
        "id": 0,
        "searchId": 0,
        "sapiRateId": "string",
        "outOfPolicy": true,
        "violations": {
          "travelPolicy": {
            "isBookingAllowed": "allowed",
            "incidentalsRequired": true,
            "refundableRequired": true,
            "maxDailyRate": {
              "applicableMaxDailyRate": 0,
              "exceedsRate": true
            }
          }
        }
      },
      "roomTitle": "string",
      "roomDescription": "string",
      "criteria": {
        "latitude": 0,
        "longitude": 0,
        "locationDescription": "string",
        "checkIn": "string",
        "checkOut": "string",
        "roomCount": 1,
        "guestCount": 1,
        "radiusMiles": 0,
        "locationKind": "address"
      }
    },
    "name": "lodging_create_cart"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "propertyId": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 999999999999
    },
    "rateToken": {
      "type": "string",
      "description": "From the rate's `lodging_create_cart` link; pass exactly as returned (may be a short reference)",
      "x-engine/opaqueReference": {
        "fromTool": "lodging_get_room_rates",
        "fromResponse": "data.rooms[].rates[]._links.lodging_create_cart.body.rateToken"
      }
    },
    "rate": {
      "type": "object",
      "properties": {
        "id": {
          "type": "integer"
        },
        "searchId": {
          "type": "number"
        },
        "sapiRateId": {
          "type": [
            "string",
            "null"
          ]
        },
        "outOfPolicy": {
          "type": "boolean"
        },
        "violations": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "travelPolicy": {
                  "anyOf": [
                    {
                      "type": "object",
                      "properties": {
                        "isBookingAllowed": {
                          "anyOf": [
                            {
                              "type": "string",
                              "enum": [
                                "allowed",
                                "requires_approval",
                                "blocked"
                              ]
                            },
                            {
                              "type": "null"
                            }
                          ]
                        },
                        "incidentalsRequired": {
                          "type": [
                            "boolean",
                            "null"
                          ]
                        },
                        "refundableRequired": {
                          "type": [
                            "boolean",
                            "null"
                          ]
                        },
                        "maxDailyRate": {
                          "anyOf": [
                            {
                              "type": "object",
                              "properties": {
                                "applicableMaxDailyRate": {
                                  "type": [
                                    "number",
                                    "null"
                                  ]
                                },
                                "exceedsRate": {
                                  "type": "boolean"
                                }
                              },
                              "required": [
                                "exceedsRate"
                              ],
                              "additionalProperties": false
                            },
                            {
                              "type": "null"
                            }
                          ]
                        }
                      },
                      "additionalProperties": false
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "required": [
        "id",
        "searchId",
        "outOfPolicy"
      ],
      "description": "From the rate's `lodging_create_cart` link; send it unchanged",
      "additionalProperties": false
    },
    "roomTitle": {
      "type": "string"
    },
    "roomDescription": {
      "type": "string"
    },
    "criteria": {
      "type": "object",
      "properties": {
        "latitude": {
          "type": "number"
        },
        "longitude": {
          "type": "number"
        },
        "locationDescription": {
          "type": "string"
        },
        "checkIn": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing."
        },
        "checkOut": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing."
        },
        "roomCount": {
          "type": "integer",
          "minimum": 1,
          "maximum": 8,
          "description": "Use 1 unless the user asks for more rooms. Do not ask."
        },
        "guestCount": {
          "type": "integer",
          "minimum": 1,
          "maximum": 14,
          "description": "Use 1 unless the user mentions other people. Do not ask."
        },
        "radiusMiles": {
          "type": "number",
          "exclusiveMinimum": 0,
          "maximum": 50
        },
        "locationKind": {
          "description": "`place.locationKind` from `lodging_resolve_destination`; address searches show distance. Omit when unknown.",
          "type": "string",
          "enum": [
            "address",
            "area"
          ]
        }
      },
      "required": [
        "latitude",
        "longitude",
        "locationDescription",
        "checkIn",
        "checkOut",
        "roomCount",
        "guestCount"
      ],
      "description": "The `lodging_get_room_rates` criteria, prefilled in the link",
      "additionalProperties": false
    }
  },
  "required": [
    "propertyId",
    "rateToken",
    "rate",
    "roomTitle",
    "criteria"
  ],
  "additionalProperties": false
}

Returns

{
  "data": {
    "cart": {
      "id": 0,
      "status": "string",
      "currency": "string",
      "userId": 0,
      "hasLodging": true
    },
    "summary": {
      "cartId": 0,
      "status": "string",
      "checkIn": "string",
      "checkOut": "string",
      "rateDescription": "string",
      "total": "string",
      "totalAmount": 0,
      "dueAtProperty": "string",
      "propertyId": 0,
      "roomRateId": 0,
      "guestCount": 0,
      "roomCount": 0
    },
    "traveler": {
      "firstName": "string",
      "lastName": "string"
    },
    "handoff": true,
    "reason": "string",
    "detail": "string",
    "next": "string"
  },
  "_links": {
    "*": {
      "tool": "string",
      "href": "string",
      "method": "GET",
      "description": "string",
      "body": {
        "*": null
      },
      "required": [
        "string"
      ]
    }
  },
  "_handoff": {
    "*": {
      "href": "string",
      "description": "string"
    }
  }
}
{
data*object
{…}
{
cartobject
{…}
{
id*integer
status*string
currency*string
userId*integer
hasLodging*boolean
< * >any
}
summaryobject
{…}
{
cartId*integer
status*string
checkIn*string | null
checkOut*string | null
rateDescription*string | null
total*string | null
totalAmount*number | null
dueAtPropertystring
propertyId*integer
roomRateId*integer
guestCount*integer
roomCount*integer
}
travelerobject
{…}
{
firstName*string
lastName*string
}
handoffboolean
reasonstring
detailstring
next*string

Instruction for the next call.

}
_links*object
{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
_handoffobject
{…}
{
< * >object
{…}
{
href*string
description*string
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "cart": {
          "type": "object",
          "properties": {
            "id": {
              "type": "integer"
            },
            "status": {
              "type": "string"
            },
            "currency": {
              "type": "string"
            },
            "userId": {
              "type": "integer"
            },
            "hasLodging": {
              "type": "boolean"
            }
          },
          "required": [
            "id",
            "status",
            "currency",
            "userId",
            "hasLodging"
          ],
          "additionalProperties": {}
        },
        "summary": {
          "type": "object",
          "properties": {
            "cartId": {
              "type": "integer"
            },
            "status": {
              "type": "string"
            },
            "checkIn": {
              "type": [
                "string",
                "null"
              ]
            },
            "checkOut": {
              "type": [
                "string",
                "null"
              ]
            },
            "rateDescription": {
              "type": [
                "string",
                "null"
              ]
            },
            "total": {
              "type": [
                "string",
                "null"
              ]
            },
            "totalAmount": {
              "type": [
                "number",
                "null"
              ]
            },
            "dueAtProperty": {
              "type": "string"
            },
            "propertyId": {
              "type": "integer"
            },
            "roomRateId": {
              "type": "integer"
            },
            "guestCount": {
              "type": "integer"
            },
            "roomCount": {
              "type": "integer"
            }
          },
          "required": [
            "cartId",
            "status",
            "checkIn",
            "checkOut",
            "rateDescription",
            "total",
            "totalAmount",
            "propertyId",
            "roomRateId",
            "guestCount",
            "roomCount"
          ],
          "additionalProperties": false
        },
        "traveler": {
          "type": "object",
          "properties": {
            "firstName": {
              "type": "string"
            },
            "lastName": {
              "type": "string"
            }
          },
          "required": [
            "firstName",
            "lastName"
          ],
          "additionalProperties": false
        },
        "handoff": {
          "type": "boolean"
        },
        "reason": {
          "type": "string"
        },
        "detail": {
          "type": "string"
        },
        "next": {
          "type": "string",
          "description": "Instruction for the next call."
        }
      },
      "required": [
        "next"
      ],
      "additionalProperties": false
    },
    "_links": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "tool": {
            "type": "string"
          },
          "href": {
            "type": "string"
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "POST"
            ]
          },
          "description": {
            "type": "string"
          },
          "body": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "required": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "href",
          "method",
          "description"
        ],
        "additionalProperties": false
      }
    },
    "_handoff": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "href",
          "description"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "data",
    "_links"
  ],
  "additionalProperties": false
}
READ lodging_get_booking Returns one booking by its G- booking number: hotel name, property confirmation number, dates, whether Flex was purchased, and its rooms.

Read-only — returns data and changes nothing.

Returns one booking by its G- booking number: hotel name, property confirmation number, dates, whether Flex was purchased, and its rooms. Call it before lodging_preview_cancellation or lodging_preview_shortening. It returns the contract numbers those tools require: child_bookings[].contract_number when present, otherwise the top-level contract_number. It also returns permissions for the booking and each room. The cancellation entry has authorized plus is_eligible and ineligibility_reason. authorized stays true for an authorized modifier even when the booking is already cancelled. is_eligible is then false and ineligibility_reason is "cancelled". ineligibility_reason is "not_cancellable_state" when the booking or room is completed or failed and can no longer be cancelled. A preview-cancellation template appears only when cancellation is authorized and eligible. check_in_shortening and check_out_shortening add is_eligible and deadline. guest_name_change adds is_eligible and ineligibility_reason. A preview-shortening template appears only when shortening is possible. Visibility: the MCP returns not found for an unknown booking and for any booking the member can't view. A member can view: - Admins: any booking on their business - Department managers: bookings they made, bookings for anyone in their department, and bookings made for them - Travel coordinators: bookings they made and bookings made for them. With coordinator dashboard access on, any booking on their business - Users: bookings they made and bookings made for them - View only travelers: bookings made for them The authorized flags cover changes only, not viewing. A view only traveler can't change any booking but can still look it up.

Arguments

NameDescription
booking_number* required
string

Booking number shown to the member, starting with G-, for example G-123456. Not a contract number.

  • minLength: 1
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "booking_number": "string"
    },
    "name": "lodging_get_booking"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "booking_number": {
      "type": "string",
      "minLength": 1,
      "description": "Booking number shown to the member, starting with G-, for example G-123456. Not a contract number."
    }
  },
  "required": [
    "booking_number"
  ]
}

Returns

{
  "_links": {
    "*": {
      "href": "string"
    }
  },
  "_templates": {
    "*": {
      "title": "string",
      "method": "DELETE",
      "target": "string",
      "contentType": "string",
      "properties": [
        {
          "name": "string",
          "type": "date",
          "required": true,
          "prompt": "string",
          "value": "string"
        }
      ]
    }
  },
  "check_in": "string",
  "check_out": "string",
  "child_bookings": [
    {
      "check_in": "string",
      "check_out": "string",
      "contract_number": "string",
      "permissions": {
        "cancellation": {
          "authorized": true,
          "authorized_roles": [
            "account_admin"
          ],
          "ineligibility_reason": "string",
          "is_eligible": true
        },
        "check_in_shortening": {
          "authorized": true,
          "authorized_roles": [
            "account_admin"
          ],
          "deadline": "string",
          "is_eligible": true
        },
        "check_out_shortening": {
          "authorized": true,
          "authorized_roles": [
            "account_admin"
          ],
          "deadline": "string",
          "is_eligible": true
        },
        "guest_name_change": {
          "additional_guest_change_eligible": true,
          "authorized": true,
          "authorized_roles": [
            "account_admin"
          ],
          "ineligibility_reason": "cancelled",
          "is_eligible": true,
          "primary_guest_change_eligible": true
        }
      },
      "property_confirmation_number": "string",
      "property_name": "string"
    }
  ],
  "contract_number": "string",
  "is_flex_covered": true,
  "is_hotel_collect": true,
  "permissions": {
    "cancellation": {
      "authorized": true,
      "authorized_roles": [
        "account_admin"
      ],
      "ineligibility_reason": "string",
      "is_eligible": true
    },
    "check_in_shortening": {
      "authorized": true,
      "authorized_roles": [
        "account_admin"
      ],
      "deadline": "string",
      "is_eligible": true
    },
    "check_out_shortening": {
      "authorized": true,
      "authorized_roles": [
        "account_admin"
      ],
      "deadline": "string",
      "is_eligible": true
    },
    "guest_name_change": {
      "additional_guest_change_eligible": true,
      "authorized": true,
      "authorized_roles": [
        "account_admin"
      ],
      "ineligibility_reason": "cancelled",
      "is_eligible": true,
      "primary_guest_change_eligible": true
    }
  },
  "property_confirmation_number": "string",
  "property_name": "string",
  "request_id": "string"
}
{
_linksobject

HAL links, keyed by relation (self at minimum).

{…}
{
< * >object

A HAL link.

{…}
{
href*string

Target of the link, relative to this API's base URL.

}
}
_templatesobject

Next-step affordances: a preview-shortening template, offered when at least one shortening direction is currently possible on the booking or any of its child bookings. Each room in the form chooses its own direction; the check_in_shortening / check_out_shortening permissions stay authoritative for which directions and rooms qualify. No template means shortening is not currently possible. A preview-cancellation template is offered only when cancellation is authorized and is_eligible on the booking or any child room. No such template means cancellation is not currently possible.

{…}
{
< * >object

A HAL-FORMS template describing the next step of a flow: the request to make and the inputs it takes. A response carrying no _templates is terminal — the flow is complete.

{…}
{
titlestring

Human-readable name of the step.

method*string

HTTP method to use.

  • Available values: "DELETE", "GET", "PATCH", "POST", "PUT"
target*string

URI of the step, relative to this API's base URL. {name} placeholders are filled from the property values and removed from the request body.

contentTypestring

Media type of the request body, when one is sent.

propertiesobject[]

Inputs of the step.

[{…}][
{
name*string

Field name to use in the request.

typestring

Input type of the field.

  • Available values: "date", "hidden", "json", "number", "text"
requiredboolean

Whether the field must be present when executing the template.

promptstring

Human-readable description of what to collect.

valuestring

Server-provided value to send back verbatim.

}
]
}
}
check_in*string

ISO-8601 datetime.

check_out*string

ISO-8601 datetime.

child_bookings*object[]

Per-room bookings under this booking reference.

[{…}][
{
check_in*string

ISO-8601 datetime.

check_out*string

ISO-8601 datetime.

contract_number*string

The per-room contract number.

permissions*object
{…}
{
cancellation*object

Whether the calling user may cancel, and whether the booking itself can be cancelled now. authorized stays true for an authorized modifier even when the booking is already cancelled. is_eligible is then false and ineligibility_reason is "cancelled".

{…}
{
authorized*boolean

Whether the calling user may cancel.

authorized_roles*string[]

Roles permitted to cancel.

ineligibility_reason*string | null

Why cancellation is not eligible, or null when eligible. Already-cancelled rooms use "cancelled". Completed or failed bookings and rooms use "not_cancellable_state". Additional reason strings may be added without a schema change.

is_eligible*boolean

Whether the booking itself can be cancelled now, independent of the caller. Stays false when the room is already cancelled even if authorized is true.

}
check_in_shortening*object
{…}
{
authorized*boolean

Whether the calling user may perform this modification.

authorized_roles*string[]

Roles permitted to perform this modification.

deadline*string | null

Cutoff after which the modification is no longer eligible, or null when none applies.

is_eligible*boolean

Whether the booking itself is eligible for this modification, independent of the caller.

}
check_out_shortening*object
{…}
{
authorized*boolean

Whether the calling user may perform this modification.

authorized_roles*string[]

Roles permitted to perform this modification.

deadline*string | null

Cutoff after which the modification is no longer eligible, or null when none applies.

is_eligible*boolean

Whether the booking itself is eligible for this modification, independent of the caller.

}
guest_name_change*object
{…}
{
additional_guest_change_eligible*boolean
authorized*boolean
authorized_roles*string[]
ineligibility_reason*string | null

Why a guest name change is not eligible, or null when eligible.

  • Available values: "cancelled", "loyalty_required", "not_supported", "past_check_in", "same_day", "supplier_unsupported", null
is_eligible*boolean
primary_guest_change_eligible*boolean
}
}
property_confirmation_number*string | null
property_name*string
}
]
contract_number*string

The booking reference for the whole booking.

is_flex_covered*boolean

Whether Flex was purchased for this booking. It does not mean the current cancellation is covered by Flex. lodging_preview_cancellation reports that.

is_hotel_collect*boolean
permissions*object
{…}
{
cancellation*object

Whether the calling user may cancel, and whether the booking itself can be cancelled now. authorized stays true for an authorized modifier even when the booking is already cancelled. is_eligible is then false and ineligibility_reason is "cancelled".

{…}
{
authorized*boolean

Whether the calling user may cancel.

authorized_roles*string[]

Roles permitted to cancel.

ineligibility_reason*string | null

Why cancellation is not eligible, or null when eligible. Already-cancelled rooms use "cancelled". Completed or failed bookings and rooms use "not_cancellable_state". Additional reason strings may be added without a schema change.

is_eligible*boolean

Whether the booking itself can be cancelled now, independent of the caller. Stays false when the room is already cancelled even if authorized is true.

}
check_in_shortening*object
{…}
{
authorized*boolean

Whether the calling user may perform this modification.

authorized_roles*string[]

Roles permitted to perform this modification.

deadline*string | null

Cutoff after which the modification is no longer eligible, or null when none applies.

is_eligible*boolean

Whether the booking itself is eligible for this modification, independent of the caller.

}
check_out_shortening*object
{…}
{
authorized*boolean

Whether the calling user may perform this modification.

authorized_roles*string[]

Roles permitted to perform this modification.

deadline*string | null

Cutoff after which the modification is no longer eligible, or null when none applies.

is_eligible*boolean

Whether the booking itself is eligible for this modification, independent of the caller.

}
guest_name_change*object
{…}
{
additional_guest_change_eligible*boolean
authorized*boolean
authorized_roles*string[]
ineligibility_reason*string | null

Why a guest name change is not eligible, or null when eligible.

  • Available values: "cancelled", "loyalty_required", "not_supported", "past_check_in", "same_day", "supplier_unsupported", null
is_eligible*boolean
primary_guest_change_eligible*boolean
}
}
property_confirmation_number*string | null
property_name*string
request_id*string
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "required": [
    "check_in",
    "check_out",
    "child_bookings",
    "contract_number",
    "is_flex_covered",
    "is_hotel_collect",
    "permissions",
    "property_confirmation_number",
    "property_name",
    "request_id"
  ],
  "properties": {
    "_links": {
      "type": "object",
      "description": "HAL links, keyed by relation (`self` at minimum).",
      "additionalProperties": {
        "type": "object",
        "description": "A HAL link.",
        "required": [
          "href"
        ],
        "properties": {
          "href": {
            "type": "string",
            "description": "Target of the link, relative to this API's base URL."
          }
        }
      }
    },
    "_templates": {
      "type": "object",
      "description": "Next-step affordances: a `preview-shortening` template, offered when at least one shortening direction is currently possible on the booking or any of its child bookings. Each room in the form chooses its own direction; the `check_in_shortening` / `check_out_shortening` permissions stay authoritative for which directions and rooms qualify. No template means shortening is not currently possible. A `preview-cancellation` template is offered only when cancellation is authorized and is_eligible on the booking or any child room. No such template means cancellation is not currently possible.",
      "additionalProperties": {
        "type": "object",
        "description": "A HAL-FORMS template describing the next step of a flow: the request to make and the inputs it takes. A response carrying no `_templates` is terminal — the flow is complete.",
        "required": [
          "method",
          "target"
        ],
        "properties": {
          "title": {
            "type": "string",
            "description": "Human-readable name of the step."
          },
          "method": {
            "type": "string",
            "description": "HTTP method to use.",
            "enum": [
              "DELETE",
              "GET",
              "PATCH",
              "POST",
              "PUT"
            ]
          },
          "target": {
            "type": "string",
            "description": "URI of the step, relative to this API's base URL. `{name}` placeholders are filled from the property values and removed from the request body."
          },
          "contentType": {
            "type": "string",
            "description": "Media type of the request body, when one is sent."
          },
          "properties": {
            "type": "array",
            "items": {
              "type": "object",
              "description": "One input of a HAL-FORMS template. A `value` marks a server-provided (hidden) input the consumer sends back verbatim; a required property without a `value` must be collected from the caller, guided by `prompt`.",
              "required": [
                "name"
              ],
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Field name to use in the request."
                },
                "type": {
                  "type": "string",
                  "description": "Input type of the field.",
                  "enum": [
                    "date",
                    "hidden",
                    "json",
                    "number",
                    "text"
                  ]
                },
                "required": {
                  "type": "boolean",
                  "description": "Whether the field must be present when executing the template."
                },
                "prompt": {
                  "type": "string",
                  "description": "Human-readable description of what to collect."
                },
                "value": {
                  "type": "string",
                  "description": "Server-provided value to send back verbatim."
                }
              }
            },
            "description": "Inputs of the step."
          }
        }
      }
    },
    "check_in": {
      "type": "string",
      "description": "ISO-8601 datetime."
    },
    "check_out": {
      "type": "string",
      "description": "ISO-8601 datetime."
    },
    "child_bookings": {
      "type": "array",
      "description": "Per-room bookings under this booking reference.",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "check_in",
          "check_out",
          "contract_number",
          "permissions",
          "property_confirmation_number",
          "property_name"
        ],
        "properties": {
          "check_in": {
            "type": "string",
            "description": "ISO-8601 datetime."
          },
          "check_out": {
            "type": "string",
            "description": "ISO-8601 datetime."
          },
          "contract_number": {
            "type": "string",
            "description": "The per-room contract number."
          },
          "permissions": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "cancellation",
              "check_in_shortening",
              "check_out_shortening",
              "guest_name_change"
            ],
            "properties": {
              "cancellation": {
                "type": "object",
                "description": "Whether the calling user may cancel, and whether the booking itself can be cancelled now. authorized stays true for an authorized modifier even when the booking is already cancelled. is_eligible is then false and ineligibility_reason is \"cancelled\".",
                "additionalProperties": false,
                "required": [
                  "authorized",
                  "authorized_roles",
                  "ineligibility_reason",
                  "is_eligible"
                ],
                "properties": {
                  "authorized": {
                    "type": "boolean",
                    "description": "Whether the calling user may cancel."
                  },
                  "authorized_roles": {
                    "type": "array",
                    "description": "Roles permitted to cancel.",
                    "items": {
                      "type": "string",
                      "description": "A role permitted to perform a modification.",
                      "enum": [
                        "account_admin",
                        "booker",
                        "traveler"
                      ]
                    }
                  },
                  "ineligibility_reason": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Why cancellation is not eligible, or null when eligible. Already-cancelled rooms use \"cancelled\". Completed or failed bookings and rooms use \"not_cancellable_state\". Additional reason strings may be added without a schema change."
                  },
                  "is_eligible": {
                    "type": "boolean",
                    "description": "Whether the booking itself can be cancelled now, independent of the caller. Stays false when the room is already cancelled even if authorized is true."
                  }
                }
              },
              "check_in_shortening": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "authorized",
                  "authorized_roles",
                  "deadline",
                  "is_eligible"
                ],
                "properties": {
                  "authorized": {
                    "type": "boolean",
                    "description": "Whether the calling user may perform this modification."
                  },
                  "authorized_roles": {
                    "type": "array",
                    "description": "Roles permitted to perform this modification.",
                    "items": {
                      "type": "string",
                      "description": "A role permitted to perform a modification.",
                      "enum": [
                        "account_admin",
                        "booker",
                        "traveler"
                      ]
                    }
                  },
                  "deadline": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Cutoff after which the modification is no longer eligible, or null when none applies."
                  },
                  "is_eligible": {
                    "type": "boolean",
                    "description": "Whether the booking itself is eligible for this modification, independent of the caller."
                  }
                }
              },
              "check_out_shortening": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "authorized",
                  "authorized_roles",
                  "deadline",
                  "is_eligible"
                ],
                "properties": {
                  "authorized": {
                    "type": "boolean",
                    "description": "Whether the calling user may perform this modification."
                  },
                  "authorized_roles": {
                    "type": "array",
                    "description": "Roles permitted to perform this modification.",
                    "items": {
                      "type": "string",
                      "description": "A role permitted to perform a modification.",
                      "enum": [
                        "account_admin",
                        "booker",
                        "traveler"
                      ]
                    }
                  },
                  "deadline": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Cutoff after which the modification is no longer eligible, or null when none applies."
                  },
                  "is_eligible": {
                    "type": "boolean",
                    "description": "Whether the booking itself is eligible for this modification, independent of the caller."
                  }
                }
              },
              "guest_name_change": {
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "additional_guest_change_eligible",
                  "authorized",
                  "authorized_roles",
                  "ineligibility_reason",
                  "is_eligible",
                  "primary_guest_change_eligible"
                ],
                "properties": {
                  "additional_guest_change_eligible": {
                    "type": "boolean"
                  },
                  "authorized": {
                    "type": "boolean"
                  },
                  "authorized_roles": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "description": "A role permitted to perform a modification.",
                      "enum": [
                        "account_admin",
                        "booker",
                        "traveler"
                      ]
                    }
                  },
                  "ineligibility_reason": {
                    "type": [
                      "string",
                      "null"
                    ],
                    "description": "Why a guest name change is not eligible, or null when eligible.",
                    "enum": [
                      "cancelled",
                      "loyalty_required",
                      "not_supported",
                      "past_check_in",
                      "same_day",
                      "supplier_unsupported",
                      null
                    ]
                  },
                  "is_eligible": {
                    "type": "boolean"
                  },
                  "primary_guest_change_eligible": {
                    "type": "boolean"
                  }
                }
              }
            }
          },
          "property_confirmation_number": {
            "type": [
              "string",
              "null"
            ]
          },
          "property_name": {
            "type": "string"
          }
        }
      }
    },
    "contract_number": {
      "type": "string",
      "description": "The booking reference for the whole booking."
    },
    "is_flex_covered": {
      "type": "boolean",
      "description": "Whether Flex was purchased for this booking. It does not mean the current cancellation is covered by Flex. lodging_preview_cancellation reports that."
    },
    "is_hotel_collect": {
      "type": "boolean"
    },
    "permissions": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "cancellation",
        "check_in_shortening",
        "check_out_shortening",
        "guest_name_change"
      ],
      "properties": {
        "cancellation": {
          "type": "object",
          "description": "Whether the calling user may cancel, and whether the booking itself can be cancelled now. authorized stays true for an authorized modifier even when the booking is already cancelled. is_eligible is then false and ineligibility_reason is \"cancelled\".",
          "additionalProperties": false,
          "required": [
            "authorized",
            "authorized_roles",
            "ineligibility_reason",
            "is_eligible"
          ],
          "properties": {
            "authorized": {
              "type": "boolean",
              "description": "Whether the calling user may cancel."
            },
            "authorized_roles": {
              "type": "array",
              "description": "Roles permitted to cancel.",
              "items": {
                "type": "string",
                "description": "A role permitted to perform a modification.",
                "enum": [
                  "account_admin",
                  "booker",
                  "traveler"
                ]
              }
            },
            "ineligibility_reason": {
              "type": [
                "string",
                "null"
              ],
              "description": "Why cancellation is not eligible, or null when eligible. Already-cancelled rooms use \"cancelled\". Completed or failed bookings and rooms use \"not_cancellable_state\". Additional reason strings may be added without a schema change."
            },
            "is_eligible": {
              "type": "boolean",
              "description": "Whether the booking itself can be cancelled now, independent of the caller. Stays false when the room is already cancelled even if authorized is true."
            }
          }
        },
        "check_in_shortening": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "authorized",
            "authorized_roles",
            "deadline",
            "is_eligible"
          ],
          "properties": {
            "authorized": {
              "type": "boolean",
              "description": "Whether the calling user may perform this modification."
            },
            "authorized_roles": {
              "type": "array",
              "description": "Roles permitted to perform this modification.",
              "items": {
                "type": "string",
                "description": "A role permitted to perform a modification.",
                "enum": [
                  "account_admin",
                  "booker",
                  "traveler"
                ]
              }
            },
            "deadline": {
              "type": [
                "string",
                "null"
              ],
              "description": "Cutoff after which the modification is no longer eligible, or null when none applies."
            },
            "is_eligible": {
              "type": "boolean",
              "description": "Whether the booking itself is eligible for this modification, independent of the caller."
            }
          }
        },
        "check_out_shortening": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "authorized",
            "authorized_roles",
            "deadline",
            "is_eligible"
          ],
          "properties": {
            "authorized": {
              "type": "boolean",
              "description": "Whether the calling user may perform this modification."
            },
            "authorized_roles": {
              "type": "array",
              "description": "Roles permitted to perform this modification.",
              "items": {
                "type": "string",
                "description": "A role permitted to perform a modification.",
                "enum": [
                  "account_admin",
                  "booker",
                  "traveler"
                ]
              }
            },
            "deadline": {
              "type": [
                "string",
                "null"
              ],
              "description": "Cutoff after which the modification is no longer eligible, or null when none applies."
            },
            "is_eligible": {
              "type": "boolean",
              "description": "Whether the booking itself is eligible for this modification, independent of the caller."
            }
          }
        },
        "guest_name_change": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "additional_guest_change_eligible",
            "authorized",
            "authorized_roles",
            "ineligibility_reason",
            "is_eligible",
            "primary_guest_change_eligible"
          ],
          "properties": {
            "additional_guest_change_eligible": {
              "type": "boolean"
            },
            "authorized": {
              "type": "boolean"
            },
            "authorized_roles": {
              "type": "array",
              "items": {
                "type": "string",
                "description": "A role permitted to perform a modification.",
                "enum": [
                  "account_admin",
                  "booker",
                  "traveler"
                ]
              }
            },
            "ineligibility_reason": {
              "type": [
                "string",
                "null"
              ],
              "description": "Why a guest name change is not eligible, or null when eligible.",
              "enum": [
                "cancelled",
                "loyalty_required",
                "not_supported",
                "past_check_in",
                "same_day",
                "supplier_unsupported",
                null
              ]
            },
            "is_eligible": {
              "type": "boolean"
            },
            "primary_guest_change_eligible": {
              "type": "boolean"
            }
          }
        }
      }
    },
    "property_confirmation_number": {
      "type": [
        "string",
        "null"
      ]
    },
    "property_name": {
      "type": "string"
    },
    "request_id": {
      "type": "string"
    }
  }
}
READ lodging_get_current_user Confirms who is booking: first name, last name, email.

Read-only — returns data and changes nothing.

Confirms who is booking: first name, last name, email. Call first. The current user is the only traveler supported.

Arguments

Takes no arguments.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {},
    "name": "lodging_get_current_user"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {},
  "additionalProperties": false
}

Returns

{
  "data": {
    "firstName": "string",
    "lastName": "string",
    "email": "string",
    "next": "string"
  },
  "_links": {
    "*": {
      "tool": "string",
      "href": "string",
      "method": "GET",
      "description": "string",
      "body": {
        "*": null
      },
      "required": [
        "string"
      ]
    }
  },
  "_handoff": {
    "*": {
      "href": "string",
      "description": "string"
    }
  }
}
{
data*object
{…}
{
firstName*string
lastName*string
email*string
next*string

Instruction for the next call.

}
_links*object
{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
_handoffobject
{…}
{
< * >object
{…}
{
href*string
description*string
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "firstName": {
          "type": "string"
        },
        "lastName": {
          "type": "string"
        },
        "email": {
          "type": "string"
        },
        "next": {
          "type": "string",
          "description": "Instruction for the next call."
        }
      },
      "required": [
        "firstName",
        "lastName",
        "email",
        "next"
      ],
      "additionalProperties": false
    },
    "_links": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "tool": {
            "type": "string"
          },
          "href": {
            "type": "string"
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "POST"
            ]
          },
          "description": {
            "type": "string"
          },
          "body": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "required": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "href",
          "method",
          "description"
        ],
        "additionalProperties": false
      }
    },
    "_handoff": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "href",
          "description"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "data",
    "_links"
  ],
  "additionalProperties": false
}
READ lodging_get_room_rates Live rooms and rates for one property.

Read-only — returns data and changes nothing.

Live rooms and rates for one property. Follow a search row's lodging_get_room_rates link; it carries roomOffersToken (pass exactly as returned; may be a short reference) and search criteria. Each rate has price, cancellation terms, and policy: allowed, requires_approval, or blocked. blocked rates cannot be selected. requires_approval rates cannot be booked here. Only allowed rates carry a _links.lodging_create_cart; the others carry a _handoff to the Engine web app. Returns at most 5 room types, in-policy first, then cheapest first, always including a room type with a refundable rate when the hotel has one; roomTypesTotal says how many the hotel has, and _handoff.open_property_in_engine shows them all. Show rates as numbered text entries, never a table. Lead with hotel.name and up to 2 of hotel.amenities.primary; when hotel is absent, lead with the hotel name from the earlier search results. Then one flat numbered list with one entry per rate, each written as N. where N is its index, in index order, with no room headings or sub-lists between entries; a room with several rates repeats its title. Each entry: first N., the room title, and features.beds; then together price.nightlyBase per night, the nightly saving price.saveAmount (was price.strikeNightly) only when price has it, and price.total for the stay; then refundable or not, and up to 2 of the rate's features and the room's other features. The user may pick by number ("3", "#3", "the 3rd one"); that always means the rate whose index is 3. Keep hotel.amenities.other, room amenities, and the other displayFields secondary values for follow-up questions instead of listing them. Keep this layout and each rate's index when you narrow or re-sort; if the shown numbers no longer run 1, 2, 3 in order, start each entry with Rate N. instead so the client does not renumber them.

Arguments

NameDescription
propertyId* required
integer
  • maximum: 999999999999
roomOffersToken* required
string

From the lodging_search_hotels row's link; pass exactly as returned (may be a short reference)

criteria* required
object

The lodging_search_hotels criteria this row came from

{…}
{
latitude*number
longitude*number
locationDescription*string
checkIn*string

YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing.

  • pattern: "^\\d{4}-\\d{2}-\\d{2}$"
checkOut*string

YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing.

  • pattern: "^\\d{4}-\\d{2}-\\d{2}$"
roomCount*integer

Use 1 unless the user asks for more rooms. Do not ask.

  • minimum: 1
  • maximum: 8
guestCount*integer

Use 1 unless the user mentions other people. Do not ask.

  • minimum: 1
  • maximum: 14
radiusMilesnumber
  • maximum: 50
locationKindstring

place.locationKind from lodging_resolve_destination; address searches show distance. Omit when unknown.

  • Available values: "address", "area"
}
hotel
object

From the lodging_search_hotels row's link; send it unchanged. Returned as hotel so the rates can lead with the hotel's amenities.

{…}
{
name*string
  • maxLength: 200
amenities*object
{…}
{
primary*string[]
other*string[]
}
}
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "propertyId": 0,
      "roomOffersToken": "string",
      "criteria": {
        "latitude": 0,
        "longitude": 0,
        "locationDescription": "string",
        "checkIn": "string",
        "checkOut": "string",
        "roomCount": 1,
        "guestCount": 1,
        "radiusMiles": 0,
        "locationKind": "address"
      },
      "hotel": {
        "name": "string",
        "amenities": {
          "primary": [
            "breakfast"
          ],
          "other": [
            "breakfast"
          ]
        }
      }
    },
    "name": "lodging_get_room_rates"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "propertyId": {
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 999999999999
    },
    "roomOffersToken": {
      "type": "string",
      "description": "From the `lodging_search_hotels` row's link; pass exactly as returned (may be a short reference)",
      "x-engine/opaqueReference": {
        "fromTool": "lodging_search_hotels",
        "fromResponse": "data.results[]._links.lodging_get_room_rates.body.roomOffersToken"
      }
    },
    "criteria": {
      "type": "object",
      "properties": {
        "latitude": {
          "type": "number"
        },
        "longitude": {
          "type": "number"
        },
        "locationDescription": {
          "type": "string"
        },
        "checkIn": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing."
        },
        "checkOut": {
          "type": "string",
          "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
          "description": "YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing."
        },
        "roomCount": {
          "type": "integer",
          "minimum": 1,
          "maximum": 8,
          "description": "Use 1 unless the user asks for more rooms. Do not ask."
        },
        "guestCount": {
          "type": "integer",
          "minimum": 1,
          "maximum": 14,
          "description": "Use 1 unless the user mentions other people. Do not ask."
        },
        "radiusMiles": {
          "type": "number",
          "exclusiveMinimum": 0,
          "maximum": 50
        },
        "locationKind": {
          "description": "`place.locationKind` from `lodging_resolve_destination`; address searches show distance. Omit when unknown.",
          "type": "string",
          "enum": [
            "address",
            "area"
          ]
        }
      },
      "required": [
        "latitude",
        "longitude",
        "locationDescription",
        "checkIn",
        "checkOut",
        "roomCount",
        "guestCount"
      ],
      "description": "The `lodging_search_hotels` criteria this row came from",
      "additionalProperties": false
    },
    "hotel": {
      "description": "From the `lodging_search_hotels` row's link; send it unchanged. Returned as `hotel` so the rates can lead with the hotel's amenities.",
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "maxLength": 200
        },
        "amenities": {
          "type": "object",
          "properties": {
            "primary": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "breakfast",
                  "parking",
                  "wifi"
                ]
              }
            },
            "other": {
              "type": "array",
              "items": {
                "type": "string",
                "enum": [
                  "breakfast",
                  "parking",
                  "wifi",
                  "fitnessCenter",
                  "swimmingPool",
                  "petFriendly",
                  "shuttle",
                  "kitchen",
                  "airConditioning",
                  "truckParking"
                ]
              }
            }
          },
          "required": [
            "primary",
            "other"
          ],
          "additionalProperties": false
        }
      },
      "required": [
        "name",
        "amenities"
      ],
      "additionalProperties": false
    }
  },
  "required": [
    "propertyId",
    "roomOffersToken",
    "criteria"
  ],
  "additionalProperties": false
}

Returns

{
  "data": {
    "propertyId": 0,
    "hotel": {
      "name": "string",
      "amenities": {
        "primary": [
          "breakfast"
        ],
        "other": [
          "string"
        ]
      }
    },
    "criteria": {
      "locationDescription": "string",
      "latitude": 0,
      "longitude": 0,
      "radiusMiles": 0,
      "checkIn": "string",
      "checkOut": "string",
      "roomCount": 0,
      "guestCount": 0,
      "locationKind": "address"
    },
    "priceChange": "decrease",
    "displayFields": {
      "room": {
        "primary": [
          "string"
        ],
        "secondary": [
          "string"
        ]
      },
      "rate": {
        "primary": [
          "string"
        ],
        "secondary": [
          "string"
        ]
      }
    },
    "rooms": [
      {
        "roomIndex": 0,
        "title": "string",
        "features": {
          "beds": "string",
          "wifi": true,
          "view": true,
          "kitchen": true,
          "accessible": true,
          "balcony": true,
          "bathtub": true
        },
        "description": "string",
        "amenities": [
          "string"
        ],
        "beddings": [
          {
            "type": "string",
            "count": 0
          }
        ],
        "rates": [
          {
            "index": 0,
            "id": 0,
            "price": {
              "nightlyBase": 0,
              "total": 0,
              "currency": "string",
              "taxesAndFees": 0,
              "strikeNightly": 0,
              "saveAmount": 0,
              "savePercent": 0
            },
            "refundable": true,
            "cancelBy": "string",
            "cancellationPolicy": "string",
            "features": {
              "breakfast": true,
              "parking": true
            },
            "policy": "allowed",
            "numNights": 0,
            "numRooms": 0,
            "nightlyRates": [
              {
                "date": "string",
                "rate": 0
              }
            ],
            "hotelCollect": true,
            "isMemberRate": true,
            "isPayLater": true,
            "loyaltyEligible": true,
            "outOfPolicy": true,
            "includedAmenities": {
              "breakfast": 0,
              "parking": 0
            },
            "ratePlan": "string",
            "_links": {
              "lodging_create_cart": {
                "tool": "string",
                "href": "string",
                "method": "GET",
                "description": "string",
                "body": {
                  "propertyId": 0,
                  "rateToken": "string",
                  "rate": {
                    "id": 0,
                    "searchId": 0,
                    "sapiRateId": "string",
                    "outOfPolicy": true,
                    "violations": null
                  },
                  "roomTitle": "string",
                  "roomDescription": "string",
                  "criteria": {
                    "locationDescription": "string",
                    "latitude": 0,
                    "longitude": 0,
                    "radiusMiles": 0,
                    "checkIn": "string",
                    "checkOut": "string",
                    "roomCount": 0,
                    "guestCount": 0,
                    "locationKind": "address"
                  }
                },
                "required": [
                  "string"
                ]
              }
            },
            "_handoff": {
              "*": {
                "href": "string",
                "description": "string"
              }
            }
          }
        ]
      }
    ],
    "roomTypesShown": 0,
    "roomTypesTotal": 0,
    "refundableRoomTypesHidden": 0,
    "next": "string"
  },
  "_links": {
    "*": {
      "tool": "string",
      "href": "string",
      "method": "GET",
      "description": "string",
      "body": {
        "*": null
      },
      "required": [
        "string"
      ]
    }
  },
  "_handoff": {
    "*": {
      "href": "string",
      "description": "string"
    }
  }
}
{
data*object
{…}
{
propertyId*integer
hotelobject

Echoed from the lodging_search_hotels row link; absent when the call did not come from a search row.

{…}
{
name*string
amenities*object
{…}
{
primary*string[]

Free breakfast, free parking, free wifi, when offered.

other*string[]

Other offered amenities from a fixed set (fitnessCenter, swimmingPool, petFriendly, shuttle, kitchen, airConditioning, truckParking); not exhaustive. For follow-up questions.

}
}
criteria*object

The search these rates came from; send it to lodging_search_hotels to re-run.

{…}
{
locationDescription*string
latitude*number
longitude*number
radiusMilesnumber
checkIn*string
checkOut*string
roomCount*integer
guestCount*integer
locationKindstring
  • Available values: "address", "area"
}
priceChange*string
  • Available values: "decrease", "increase", "none"
displayFields*object

Dotted paths into each room and each rate: primary holds what an entry is built from (next says how to show it); keep secondary for follow-up questions.

{…}
{
room*object

Dotted paths into each row. Show primary in every entry, in this order; keep secondary for follow-up questions.

{…}
{
primary*string[]
secondary*string[]
}
rate*object

Dotted paths into each row. Show primary in every entry, in this order; keep secondary for follow-up questions.

{…}
{
primary*string[]
secondary*string[]
}
}
rooms*object[]

At most 5 room types, in-policy first, then cheapest first, as the Engine web app lists them; the last slot goes to the cheapest room type with a bookable refundable rate when the five cheapest have none.

[{…}][
{
roomIndex*integer

1-based, in response order.

title*string
features*object

Fixed feature set mapped from beddings and the supplier amenity text; unmatched text stays in amenities. A feature that is absent is unknown, not unavailable: never tell the user the room lacks it (no wifi, no view); say it is not listed, or check amenities.

{…}
{
bedsstring

From beddings, e.g. "1 King".

wifiboolean
viewboolean
kitchenboolean
accessibleboolean
balconyboolean
bathtubboolean
}
descriptionstring
amenitiesstring[]

Supplier amenity text; for follow-up questions.

beddingsobject[]
[{…}][
{
typestring
countnumber
}
]
rates*object[]
[{…}][
{
index*integer

1-based across all rooms in this response; shown as N. and the number the user picks by.

id*integer
price*object
{…}
{
nightlyBase*number | null

Nightly rate before taxes and fees; null with total.

total*number | null

Stay total, taxes and fees included; null with nightlyBase.

currencystring

Omitted when the backend sent none: show the amounts without a currency, never guess one.

taxesAndFeesnumber

Stay taxes and fees, when the tool knows them.

strikeNightlynumber

Nightly price before the saving. Present with saveAmount.

saveAmountnumber

Nightly saving. Omitted when there is none worth showing (under 5 and under 10%) or the rate is a negotiated program rate.

savePercentinteger

Nightly saving in whole percent. Only with saveAmount, and omitted when it cannot be known or rounds to 0.

}
refundable*boolean

True only while cancelBy, the free-cancellation deadline, is more than 2 hours ahead.

cancelBystring
cancellationPolicystring
features*object

Included with this rate (true) or not (false); omitted when unknown, which never means not included.

{…}
{
breakfastboolean
parkingboolean
}
policy*string
  • Available values: "allowed", "requires_approval", "blocked"
numNights*integer
numRooms*integer
nightlyRates*object[]
[{…}][
{
date*string
rate*number
}
]
hotelCollect*boolean
isMemberRate*boolean
isPayLater*boolean
loyaltyEligible*boolean
outOfPolicy*boolean
includedAmenitiesobject

As LSS sent it; omitted when LSS sent none. features holds the reading.

{…}
{
breakfastinteger

0 unknown, 1 unavailable, 2 available.

parkinginteger

0 unknown, 1 unavailable, 2 available.

}
ratePlanstring
_linksobject

lodging_create_cart, fully prefilled with this rate's own rateToken, on allowed rates only.

{…}
{
lodging_create_cartobject
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
propertyId*integer
rateToken*string
rate*object
{…}
{
id*integer
searchId*number
sapiRateIdstring | null
outOfPolicy*boolean
violationsobject | null
}
roomTitle*string
roomDescriptionstring
criteria*object
{…}
{
locationDescription*string
latitude*number
longitude*number
radiusMilesnumber
checkIn*string
checkOut*string
roomCount*integer
guestCount*integer
locationKindstring
  • Available values: "address", "area"
}
}
requiredstring[]
}
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
_handoffobject

Engine web app link on requires_approval and blocked rates, and on any rate LSS sent without a token.

{…}
{
< * >object
{…}
{
href*string
description*string
}
}
}
]
}
]
roomTypesShown*integer
roomTypesTotal*integer

Room types the hotel offers; the ones beyond roomTypesShown are in _handoff.open_property_in_engine.

refundableRoomTypesHidden*integer

Unlisted room types that have a bookable refundable rate; the shown five always include one when the hotel has any.

next*string

Instruction for the next call.

}
_links*object
{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
_handoffobject
{…}
{
< * >object
{…}
{
href*string
description*string
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "propertyId": {
          "type": "integer"
        },
        "hotel": {
          "description": "Echoed from the lodging_search_hotels row link; absent when the call did not come from a search row.",
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "amenities": {
              "type": "object",
              "properties": {
                "primary": {
                  "type": "array",
                  "items": {
                    "type": "string",
                    "enum": [
                      "breakfast",
                      "parking",
                      "wifi"
                    ]
                  },
                  "description": "Free breakfast, free parking, free wifi, when offered."
                },
                "other": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  },
                  "description": "Other offered amenities from a fixed set (fitnessCenter, swimmingPool, petFriendly, shuttle, kitchen, airConditioning, truckParking); not exhaustive. For follow-up questions."
                }
              },
              "required": [
                "primary",
                "other"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "name",
            "amenities"
          ],
          "additionalProperties": false
        },
        "criteria": {
          "type": "object",
          "properties": {
            "locationDescription": {
              "type": "string"
            },
            "latitude": {
              "type": "number"
            },
            "longitude": {
              "type": "number"
            },
            "radiusMiles": {
              "type": "number"
            },
            "checkIn": {
              "type": "string"
            },
            "checkOut": {
              "type": "string"
            },
            "roomCount": {
              "type": "integer"
            },
            "guestCount": {
              "type": "integer"
            },
            "locationKind": {
              "type": "string",
              "enum": [
                "address",
                "area"
              ]
            }
          },
          "required": [
            "locationDescription",
            "latitude",
            "longitude",
            "checkIn",
            "checkOut",
            "roomCount",
            "guestCount"
          ],
          "additionalProperties": false,
          "description": "The search these rates came from; send it to lodging_search_hotels to re-run."
        },
        "priceChange": {
          "type": "string",
          "enum": [
            "decrease",
            "increase",
            "none"
          ]
        },
        "displayFields": {
          "type": "object",
          "properties": {
            "room": {
              "type": "object",
              "properties": {
                "primary": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "secondary": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "primary",
                "secondary"
              ],
              "additionalProperties": false,
              "description": "Dotted paths into each row. Show primary in every entry, in this order; keep secondary for follow-up questions."
            },
            "rate": {
              "type": "object",
              "properties": {
                "primary": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                },
                "secondary": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "primary",
                "secondary"
              ],
              "additionalProperties": false,
              "description": "Dotted paths into each row. Show primary in every entry, in this order; keep secondary for follow-up questions."
            }
          },
          "required": [
            "room",
            "rate"
          ],
          "additionalProperties": false,
          "description": "Dotted paths into each room and each rate: primary holds what an entry is built from (next says how to show it); keep secondary for follow-up questions."
        },
        "rooms": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "roomIndex": {
                "type": "integer",
                "description": "1-based, in response order."
              },
              "title": {
                "type": "string"
              },
              "features": {
                "type": "object",
                "properties": {
                  "beds": {
                    "description": "From beddings, e.g. \"1 King\".",
                    "type": "string"
                  },
                  "wifi": {
                    "type": "boolean",
                    "const": true
                  },
                  "view": {
                    "type": "boolean",
                    "const": true
                  },
                  "kitchen": {
                    "type": "boolean",
                    "const": true
                  },
                  "accessible": {
                    "type": "boolean",
                    "const": true
                  },
                  "balcony": {
                    "type": "boolean",
                    "const": true
                  },
                  "bathtub": {
                    "type": "boolean",
                    "const": true
                  }
                },
                "additionalProperties": false,
                "description": "Fixed feature set mapped from beddings and the supplier amenity text; unmatched text stays in amenities. A feature that is absent is unknown, not unavailable: never tell the user the room lacks it (no wifi, no view); say it is not listed, or check amenities."
              },
              "description": {
                "type": "string"
              },
              "amenities": {
                "description": "Supplier amenity text; for follow-up questions.",
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "beddings": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "type": {
                      "type": "string"
                    },
                    "count": {
                      "type": "number"
                    }
                  },
                  "additionalProperties": false
                }
              },
              "rates": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "index": {
                      "type": "integer",
                      "description": "1-based across all rooms in this response; shown as `N.` and the number the user picks by."
                    },
                    "id": {
                      "type": "integer"
                    },
                    "price": {
                      "type": "object",
                      "properties": {
                        "nightlyBase": {
                          "description": "Nightly rate before taxes and fees; null with total.",
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "total": {
                          "description": "Stay total, taxes and fees included; null with nightlyBase.",
                          "type": [
                            "number",
                            "null"
                          ]
                        },
                        "currency": {
                          "description": "Omitted when the backend sent none: show the amounts without a currency, never guess one.",
                          "type": "string"
                        },
                        "taxesAndFees": {
                          "description": "Stay taxes and fees, when the tool knows them.",
                          "type": "number"
                        },
                        "strikeNightly": {
                          "description": "Nightly price before the saving. Present with saveAmount.",
                          "type": "number"
                        },
                        "saveAmount": {
                          "description": "Nightly saving. Omitted when there is none worth showing (under 5 and under 10%) or the rate is a negotiated program rate.",
                          "type": "number"
                        },
                        "savePercent": {
                          "description": "Nightly saving in whole percent. Only with saveAmount, and omitted when it cannot be known or rounds to 0.",
                          "type": "integer"
                        }
                      },
                      "required": [
                        "nightlyBase",
                        "total"
                      ],
                      "additionalProperties": false
                    },
                    "refundable": {
                      "type": "boolean",
                      "description": "True only while cancelBy, the free-cancellation deadline, is more than 2 hours ahead."
                    },
                    "cancelBy": {
                      "type": "string"
                    },
                    "cancellationPolicy": {
                      "type": "string"
                    },
                    "features": {
                      "type": "object",
                      "properties": {
                        "breakfast": {
                          "type": "boolean"
                        },
                        "parking": {
                          "type": "boolean"
                        }
                      },
                      "additionalProperties": false,
                      "description": "Included with this rate (true) or not (false); omitted when unknown, which never means not included."
                    },
                    "policy": {
                      "type": "string",
                      "enum": [
                        "allowed",
                        "requires_approval",
                        "blocked"
                      ]
                    },
                    "numNights": {
                      "type": "integer"
                    },
                    "numRooms": {
                      "type": "integer"
                    },
                    "nightlyRates": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "date": {
                            "type": "string"
                          },
                          "rate": {
                            "type": "number"
                          }
                        },
                        "required": [
                          "date",
                          "rate"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "hotelCollect": {
                      "type": "boolean"
                    },
                    "isMemberRate": {
                      "type": "boolean"
                    },
                    "isPayLater": {
                      "type": "boolean"
                    },
                    "loyaltyEligible": {
                      "type": "boolean"
                    },
                    "outOfPolicy": {
                      "type": "boolean"
                    },
                    "includedAmenities": {
                      "description": "As LSS sent it; omitted when LSS sent none. features holds the reading.",
                      "type": "object",
                      "properties": {
                        "breakfast": {
                          "description": "0 unknown, 1 unavailable, 2 available.",
                          "type": "integer"
                        },
                        "parking": {
                          "description": "0 unknown, 1 unavailable, 2 available.",
                          "type": "integer"
                        }
                      },
                      "additionalProperties": false
                    },
                    "ratePlan": {
                      "type": "string"
                    },
                    "_links": {
                      "description": "lodging_create_cart, fully prefilled with this rate's own rateToken, on allowed rates only.",
                      "type": "object",
                      "properties": {
                        "lodging_create_cart": {
                          "type": "object",
                          "properties": {
                            "tool": {
                              "type": "string"
                            },
                            "href": {
                              "type": "string"
                            },
                            "method": {
                              "type": "string",
                              "enum": [
                                "GET",
                                "POST"
                              ]
                            },
                            "description": {
                              "type": "string"
                            },
                            "body": {
                              "type": "object",
                              "properties": {
                                "propertyId": {
                                  "type": "integer"
                                },
                                "rateToken": {
                                  "type": "string",
                                  "x-engine/opaqueReference": true
                                },
                                "rate": {
                                  "type": "object",
                                  "properties": {
                                    "id": {
                                      "type": "integer"
                                    },
                                    "searchId": {
                                      "type": "number"
                                    },
                                    "sapiRateId": {
                                      "type": [
                                        "string",
                                        "null"
                                      ]
                                    },
                                    "outOfPolicy": {
                                      "type": "boolean"
                                    },
                                    "violations": {
                                      "anyOf": [
                                        {
                                          "type": "object",
                                          "properties": {
                                            "travelPolicy": {
                                              "anyOf": [
                                                {
                                                  "type": "object",
                                                  "properties": {
                                                    "isBookingAllowed": {
                                                      "anyOf": [
                                                        {
                                                          "type": "string",
                                                          "enum": [
                                                            "allowed",
                                                            "requires_approval",
                                                            "blocked"
                                                          ]
                                                        },
                                                        {
                                                          "type": "null"
                                                        }
                                                      ]
                                                    },
                                                    "incidentalsRequired": {
                                                      "type": [
                                                        "boolean",
                                                        "null"
                                                      ]
                                                    },
                                                    "refundableRequired": {
                                                      "type": [
                                                        "boolean",
                                                        "null"
                                                      ]
                                                    },
                                                    "maxDailyRate": {
                                                      "anyOf": [
                                                        {
                                                          "type": "object",
                                                          "properties": {
                                                            "applicableMaxDailyRate": {
                                                              "type": [
                                                                "number",
                                                                "null"
                                                              ]
                                                            },
                                                            "exceedsRate": {
                                                              "type": "boolean"
                                                            }
                                                          },
                                                          "required": [
                                                            "exceedsRate"
                                                          ],
                                                          "additionalProperties": false
                                                        },
                                                        {
                                                          "type": "null"
                                                        }
                                                      ]
                                                    }
                                                  },
                                                  "additionalProperties": false
                                                },
                                                {
                                                  "type": "null"
                                                }
                                              ]
                                            }
                                          },
                                          "additionalProperties": false
                                        },
                                        {
                                          "type": "null"
                                        }
                                      ]
                                    }
                                  },
                                  "required": [
                                    "id",
                                    "searchId",
                                    "outOfPolicy"
                                  ],
                                  "additionalProperties": false
                                },
                                "roomTitle": {
                                  "type": "string"
                                },
                                "roomDescription": {
                                  "type": "string"
                                },
                                "criteria": {
                                  "type": "object",
                                  "properties": {
                                    "locationDescription": {
                                      "type": "string"
                                    },
                                    "latitude": {
                                      "type": "number"
                                    },
                                    "longitude": {
                                      "type": "number"
                                    },
                                    "radiusMiles": {
                                      "type": "number"
                                    },
                                    "checkIn": {
                                      "type": "string"
                                    },
                                    "checkOut": {
                                      "type": "string"
                                    },
                                    "roomCount": {
                                      "type": "integer"
                                    },
                                    "guestCount": {
                                      "type": "integer"
                                    },
                                    "locationKind": {
                                      "type": "string",
                                      "enum": [
                                        "address",
                                        "area"
                                      ]
                                    }
                                  },
                                  "required": [
                                    "locationDescription",
                                    "latitude",
                                    "longitude",
                                    "checkIn",
                                    "checkOut",
                                    "roomCount",
                                    "guestCount"
                                  ],
                                  "additionalProperties": false
                                }
                              },
                              "required": [
                                "propertyId",
                                "rateToken",
                                "rate",
                                "roomTitle",
                                "criteria"
                              ],
                              "additionalProperties": false
                            },
                            "required": {
                              "type": "array",
                              "items": {
                                "type": "string"
                              }
                            }
                          },
                          "required": [
                            "href",
                            "method",
                            "description"
                          ],
                          "additionalProperties": false
                        }
                      },
                      "additionalProperties": {
                        "type": "object",
                        "properties": {
                          "tool": {
                            "type": "string"
                          },
                          "href": {
                            "type": "string"
                          },
                          "method": {
                            "type": "string",
                            "enum": [
                              "GET",
                              "POST"
                            ]
                          },
                          "description": {
                            "type": "string"
                          },
                          "body": {
                            "type": "object",
                            "propertyNames": {
                              "type": "string"
                            },
                            "additionalProperties": {}
                          },
                          "required": {
                            "type": "array",
                            "items": {
                              "type": "string"
                            }
                          }
                        },
                        "required": [
                          "href",
                          "method",
                          "description"
                        ],
                        "additionalProperties": false
                      }
                    },
                    "_handoff": {
                      "description": "Engine web app link on requires_approval and blocked rates, and on any rate LSS sent without a token.",
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {
                        "type": "object",
                        "properties": {
                          "href": {
                            "type": "string"
                          },
                          "description": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "href",
                          "description"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "index",
                    "id",
                    "price",
                    "refundable",
                    "features",
                    "policy",
                    "numNights",
                    "numRooms",
                    "nightlyRates",
                    "hotelCollect",
                    "isMemberRate",
                    "isPayLater",
                    "loyaltyEligible",
                    "outOfPolicy"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "roomIndex",
              "title",
              "features",
              "rates"
            ],
            "additionalProperties": false
          },
          "description": "At most 5 room types, in-policy first, then cheapest first, as the Engine web app lists them; the last slot goes to the cheapest room type with a bookable refundable rate when the five cheapest have none."
        },
        "roomTypesShown": {
          "type": "integer"
        },
        "roomTypesTotal": {
          "type": "integer",
          "description": "Room types the hotel offers; the ones beyond roomTypesShown are in _handoff.open_property_in_engine."
        },
        "refundableRoomTypesHidden": {
          "type": "integer",
          "description": "Unlisted room types that have a bookable refundable rate; the shown five always include one when the hotel has any."
        },
        "next": {
          "type": "string",
          "description": "Instruction for the next call."
        }
      },
      "required": [
        "propertyId",
        "criteria",
        "priceChange",
        "displayFields",
        "rooms",
        "roomTypesShown",
        "roomTypesTotal",
        "refundableRoomTypesHidden",
        "next"
      ],
      "additionalProperties": false
    },
    "_links": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "tool": {
            "type": "string"
          },
          "href": {
            "type": "string"
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "POST"
            ]
          },
          "description": {
            "type": "string"
          },
          "body": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "required": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "href",
          "method",
          "description"
        ],
        "additionalProperties": false
      }
    },
    "_handoff": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "href",
          "description"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "data",
    "_links"
  ],
  "additionalProperties": false
}
READ lodging_list_payment_methods Lists this member's saved cards (including EngineX) and company direct bill.

Read-only — returns data and changes nothing.

Lists this member's saved cards (including EngineX) and company direct bill. Propose recommendedId when set, then confirm the chosen method with the member before booking. New cards are added in Engine; never accept a card number. At most 10 cards are listed (the default card always is); hiddenCardCount says how many more the member can pick in Engine via _handoff.finish_in_engine. If none are usable, give the member the _handoff.finish_in_engine link when present to continue their booking there; otherwise follow _links.

Arguments

NameDescription
cartId
integer

When set, each usable method links to lodging_book_cart for this cart

  • maximum: 999999999999
propertyId
integer

Required with cartId, for the book-page handoff when no method is usable

  • maximum: 999999999999
checkIn
string

Stay check-in (YYYY-MM-DD) from lodging_search_hotels or lodging_create_cart, for the members handoff

  • pattern: "^\\d{4}-\\d{2}-\\d{2}$"
checkOut
string

Stay check-out (YYYY-MM-DD) from lodging_search_hotels or lodging_create_cart, for the members handoff

  • pattern: "^\\d{4}-\\d{2}-\\d{2}$"
guestCount
integer

The guestCount this cart was created with (prefilled by lodging_create_cart). Only builds the members handoff.

  • minimum: 1
  • maximum: 14
roomCount
integer

The roomCount this cart was created with (prefilled by lodging_create_cart). Only builds the members handoff.

  • minimum: 1
  • maximum: 8
roomRateId
integer

rate.id this cart was created for, from lodging_create_cart

  • maximum: 999999999999
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "cartId": 0,
      "propertyId": 0,
      "checkIn": "string",
      "checkOut": "string",
      "guestCount": 1,
      "roomCount": 1,
      "roomRateId": 0
    },
    "name": "lodging_list_payment_methods"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "cartId": {
      "description": "When set, each usable method links to `lodging_book_cart` for this cart",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 999999999999
    },
    "propertyId": {
      "description": "Required with `cartId`, for the book-page handoff when no method is usable",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 999999999999
    },
    "checkIn": {
      "description": "Stay check-in (YYYY-MM-DD) from `lodging_search_hotels` or `lodging_create_cart`, for the members handoff",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "checkOut": {
      "description": "Stay check-out (YYYY-MM-DD) from `lodging_search_hotels` or `lodging_create_cart`, for the members handoff",
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$"
    },
    "guestCount": {
      "description": "The guestCount this cart was created with (prefilled by `lodging_create_cart`). Only builds the members handoff.",
      "type": "integer",
      "minimum": 1,
      "maximum": 14
    },
    "roomCount": {
      "description": "The roomCount this cart was created with (prefilled by `lodging_create_cart`). Only builds the members handoff.",
      "type": "integer",
      "minimum": 1,
      "maximum": 8
    },
    "roomRateId": {
      "description": "rate.id this cart was created for, from `lodging_create_cart`",
      "type": "integer",
      "exclusiveMinimum": 0,
      "maximum": 999999999999
    }
  },
  "additionalProperties": false
}

Returns

{
  "data": {
    "methods": [
      {
        "id": 0,
        "label": "string",
        "type": "string",
        "lastFour": "string",
        "isDefault": true,
        "isExpired": true,
        "isEngineX": true,
        "_links": {
          "*": {
            "tool": "string",
            "href": "string",
            "method": "GET",
            "description": "string",
            "body": {
              "*": null
            },
            "required": [
              "string"
            ]
          }
        }
      }
    ],
    "usableCount": 0,
    "recommendedId": 0,
    "hiddenCardCount": 0,
    "cartTotal": {
      "amount": 0,
      "currency": "string"
    },
    "next": "string"
  },
  "_links": {
    "*": {
      "tool": "string",
      "href": "string",
      "method": "GET",
      "description": "string",
      "body": {
        "*": null
      },
      "required": [
        "string"
      ]
    }
  },
  "_handoff": {
    "*": {
      "href": "string",
      "description": "string"
    }
  }
}
{
data*object
{…}
{
methods*object[]
[{…}][
{
id*integer | string
label*string
type*string
lastFourstring
isDefault*boolean
isExpired*boolean
isEngineX*boolean
_linksobject
{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
}
]
usableCount*integer
recommendedId*integer | string | null
hiddenCardCount*integer
cartTotalobject | null
next*string

Instruction for the next call.

}
_links*object
{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
_handoffobject
{…}
{
< * >object
{…}
{
href*string
description*string
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "methods": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "anyOf": [
                  {
                    "type": "integer"
                  },
                  {
                    "type": "string"
                  }
                ]
              },
              "label": {
                "type": "string"
              },
              "type": {
                "type": "string"
              },
              "lastFour": {
                "type": "string"
              },
              "isDefault": {
                "type": "boolean"
              },
              "isExpired": {
                "type": "boolean"
              },
              "isEngineX": {
                "type": "boolean"
              },
              "_links": {
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "tool": {
                      "type": "string"
                    },
                    "href": {
                      "type": "string"
                    },
                    "method": {
                      "type": "string",
                      "enum": [
                        "GET",
                        "POST"
                      ]
                    },
                    "description": {
                      "type": "string"
                    },
                    "body": {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {}
                    },
                    "required": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "href",
                    "method",
                    "description"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "id",
              "label",
              "type",
              "isDefault",
              "isExpired",
              "isEngineX"
            ],
            "additionalProperties": false
          }
        },
        "usableCount": {
          "type": "integer"
        },
        "recommendedId": {
          "anyOf": [
            {
              "anyOf": [
                {
                  "type": "integer"
                },
                {
                  "type": "string"
                }
              ]
            },
            {
              "type": "null"
            }
          ]
        },
        "hiddenCardCount": {
          "type": "integer"
        },
        "cartTotal": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "amount": {
                  "type": "number"
                },
                "currency": {
                  "type": "string"
                }
              },
              "required": [
                "amount",
                "currency"
              ],
              "additionalProperties": false
            },
            {
              "type": "null"
            }
          ]
        },
        "next": {
          "type": "string",
          "description": "Instruction for the next call."
        }
      },
      "required": [
        "methods",
        "usableCount",
        "recommendedId",
        "hiddenCardCount",
        "next"
      ],
      "additionalProperties": false
    },
    "_links": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "tool": {
            "type": "string"
          },
          "href": {
            "type": "string"
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "POST"
            ]
          },
          "description": {
            "type": "string"
          },
          "body": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "required": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "href",
          "method",
          "description"
        ],
        "additionalProperties": false
      }
    },
    "_handoff": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "href",
          "description"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "data",
    "_links"
  ],
  "additionalProperties": false
}
READ lodging_preview_cancellation Prices the cancellation of one or more rooms on a booking.

Read-only — returns data and changes nothing.

Prices the cancellation of one or more rooms on a booking. Call lodging_get_booking first for the contract numbers. Returns the refund total and destinations, any penalty, per-room amounts, whether Flex covers the penalty, and the continuation_token that lodging_submit_cancellation requires. refund is null when no refund is issued, such as on a pay-later booking. Call lodging_submit_cancellation only after the member has seen these terms and confirmed. BOOKING_ALREADY_CANCELLED means a selected room is cancelled.

Arguments

NameDescription
booking_number* required
string

G- booking number from lodging_get_booking or the member. Not a contract number.

  • minLength: 1
rooms* required
object[]

One entry per room to cancel. List each contract number once.

  • minItems: 1
[{…}][
{
contract_number*string

Room contract number from lodging_get_booking: child_bookings[].contract_number when present, otherwise the top-level contract_number. Not the G- booking number.

  • minLength: 1
}
]
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "booking_number": "string",
      "rooms": [
        {
          "contract_number": "string"
        }
      ]
    },
    "name": "lodging_preview_cancellation"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "booking_number": {
      "type": "string",
      "minLength": 1,
      "description": "G- booking number from lodging_get_booking or the member. Not a contract number."
    },
    "rooms": {
      "type": "array",
      "minItems": 1,
      "description": "One entry per room to cancel. List each contract number once.",
      "items": {
        "type": "object",
        "properties": {
          "contract_number": {
            "type": "string",
            "minLength": 1,
            "description": "Room contract number from lodging_get_booking: child_bookings[].contract_number when present, otherwise the top-level contract_number. Not the G- booking number."
          }
        },
        "required": [
          "contract_number"
        ]
      }
    }
  },
  "required": [
    "booking_number",
    "rooms"
  ]
}

Returns

{
  "_links": {
    "*": {
      "href": "string"
    }
  },
  "booking_number": "string",
  "continuation_token": "string",
  "is_flex_covered": true,
  "penalty": {
    "amount": {
      "amount": "string",
      "currency": "string"
    },
    "is_flex_covered": true,
    "nights_penalty": 0
  },
  "refund": {
    "total": {
      "amount": "string",
      "currency": "string"
    },
    "methods": [
      {
        "type": "credit_card",
        "amount": {
          "amount": "string",
          "currency": "string"
        }
      }
    ]
  },
  "rooms": [
    {
      "contract_number": "string",
      "refund_total": {
        "amount": "string",
        "currency": "string"
      },
      "penalty": {
        "amount": "string",
        "currency": "string"
      }
    }
  ],
  "request_id": "string"
}
{
_linksobject

HAL links. The preview response is affordance-terminal — it carries no _templates. Commit the preview by calling lodging_submit_cancellation with the continuation_token from this response.

{…}
{
< * >object

A HAL link.

{…}
{
href*string

Target of the link, relative to this API's base URL.

}
}
booking_number*string

The booking the preview is for.

continuation_token*string

Opaque token identifying exactly this previewed plan. Always present; pass it back unchanged to lodging_submit_cancellation.

is_flex_covered*boolean

True only when the cancellation window in effect right now is a Flex window. False inside the hotel's own free-cancellation window, even on a Flex booking, because the refund there comes from the hotel policy, not Flex. Also false after the Flex cutoff.

penalty*object | null

Cancellation penalty for the selected rooms, or null when there is none.

{…}
{
amount*object

Penalty amount for the selected rooms.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
is_flex_covered*boolean

Whether Flex coverage absorbs the penalty.

nights_penalty*integer | null

Number of nights the penalty is based on, or null when it is not night-based.

}
refund*object | null

Refund for the selected rooms, or null when no refund is issued (for example, a pay-later booking).

{…}
{
total*object

Total refund across all destinations.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
methods*object[]

Refund destinations with a positive amount. A destination receiving nothing is omitted.

[{…}][
{
type*string

Where this part of the refund goes.

  • Available values: "credit_card", "direct_bill", "reward_points", "travel_credits"
amount*object

Amount refunded to this destination. Always positive.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
}
]
}
rooms*object[]

Per-room breakdown: one entry per selected room, in request order.

[{…}][
{
contract_number*string

The room's contract number, as sent in the request.

refund_total*object | null

Refund for this room. Null exactly when the top-level refund is null (no refund is issued, e.g. a pay-later booking), so "no refund" stays distinct from a zero refund.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
penalty*object | null

This room's share of the top-level penalty, before any Flex coverage, or null when the room bears none. The shares sum to penalty.amount.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
}
]
request_id*string
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "required": [
    "booking_number",
    "continuation_token",
    "is_flex_covered",
    "penalty",
    "refund",
    "rooms",
    "request_id"
  ],
  "properties": {
    "_links": {
      "type": "object",
      "description": "HAL links. The preview response is affordance-terminal — it carries no `_templates`. Commit the preview by calling `lodging_submit_cancellation` with the `continuation_token` from this response.",
      "additionalProperties": {
        "type": "object",
        "description": "A HAL link.",
        "required": [
          "href"
        ],
        "properties": {
          "href": {
            "type": "string",
            "description": "Target of the link, relative to this API's base URL."
          }
        }
      }
    },
    "booking_number": {
      "type": "string",
      "description": "The booking the preview is for."
    },
    "continuation_token": {
      "type": "string",
      "description": "Opaque token identifying exactly this previewed plan. Always present; pass it back unchanged to `lodging_submit_cancellation`."
    },
    "is_flex_covered": {
      "type": "boolean",
      "description": "True only when the cancellation window in effect right now is a Flex window. False inside the hotel's own free-cancellation window, even on a Flex booking, because the refund there comes from the hotel policy, not Flex. Also false after the Flex cutoff."
    },
    "penalty": {
      "description": "Cancellation penalty for the selected rooms, or null when there is none.",
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": false,
      "required": [
        "amount",
        "is_flex_covered",
        "nights_penalty"
      ],
      "properties": {
        "amount": {
          "description": "Penalty amount for the selected rooms.",
          "type": "object",
          "additionalProperties": false,
          "required": [
            "amount",
            "currency"
          ],
          "properties": {
            "amount": {
              "type": "string",
              "description": "Decimal amount as a string (e.g. \"150.00\")."
            },
            "currency": {
              "type": "string",
              "description": "ISO 4217 currency code (e.g. \"USD\")."
            }
          }
        },
        "is_flex_covered": {
          "type": "boolean",
          "description": "Whether Flex coverage absorbs the penalty."
        },
        "nights_penalty": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Number of nights the penalty is based on, or null when it is not night-based."
        }
      }
    },
    "refund": {
      "description": "Refund for the selected rooms, or null when no refund is issued (for example, a pay-later booking).",
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": false,
      "required": [
        "total",
        "methods"
      ],
      "properties": {
        "total": {
          "description": "Total refund across all destinations.",
          "type": "object",
          "additionalProperties": false,
          "required": [
            "amount",
            "currency"
          ],
          "properties": {
            "amount": {
              "type": "string",
              "description": "Decimal amount as a string (e.g. \"150.00\")."
            },
            "currency": {
              "type": "string",
              "description": "ISO 4217 currency code (e.g. \"USD\")."
            }
          }
        },
        "methods": {
          "type": "array",
          "description": "Refund destinations with a positive amount. A destination receiving nothing is omitted.",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "type",
              "amount"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "credit_card",
                  "direct_bill",
                  "reward_points",
                  "travel_credits"
                ],
                "description": "Where this part of the refund goes."
              },
              "amount": {
                "description": "Amount refunded to this destination. Always positive.",
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "amount",
                  "currency"
                ],
                "properties": {
                  "amount": {
                    "type": "string",
                    "description": "Decimal amount as a string (e.g. \"150.00\")."
                  },
                  "currency": {
                    "type": "string",
                    "description": "ISO 4217 currency code (e.g. \"USD\")."
                  }
                }
              }
            }
          }
        }
      }
    },
    "rooms": {
      "type": "array",
      "description": "Per-room breakdown: one entry per selected room, in request order.",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "contract_number",
          "refund_total",
          "penalty"
        ],
        "properties": {
          "contract_number": {
            "type": "string",
            "description": "The room's contract number, as sent in the request."
          },
          "refund_total": {
            "description": "Refund for this room. Null exactly when the top-level `refund` is null (no refund is issued, e.g. a pay-later booking), so \"no refund\" stays distinct from a zero refund.",
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": false,
            "required": [
              "amount",
              "currency"
            ],
            "properties": {
              "amount": {
                "type": "string",
                "description": "Decimal amount as a string (e.g. \"150.00\")."
              },
              "currency": {
                "type": "string",
                "description": "ISO 4217 currency code (e.g. \"USD\")."
              }
            }
          },
          "penalty": {
            "description": "This room's share of the top-level penalty, before any Flex coverage, or null when the room bears none. The shares sum to `penalty.amount`.",
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": false,
            "required": [
              "amount",
              "currency"
            ],
            "properties": {
              "amount": {
                "type": "string",
                "description": "Decimal amount as a string (e.g. \"150.00\")."
              },
              "currency": {
                "type": "string",
                "description": "ISO 4217 currency code (e.g. \"USD\")."
              }
            }
          }
        }
      }
    },
    "request_id": {
      "type": "string"
    }
  }
}
READ lodging_preview_shortening Prices a later check-in or earlier check-out for one or more rooms on a booking.

Read-only — returns data and changes nothing.

Prices a later check-in or earlier check-out for one or more rooms on a booking. Each room moves one date, not both. Call lodging_get_booking first for the contract numbers, shortening permissions, and deadlines. Returns the refund total, refund type, per-room refund amounts, Flex coverage, is_refundable, and the continuation_token that lodging_submit_shortening requires. Call lodging_submit_shortening only after the member has seen these terms and confirmed. When a room can't be shortened, the MCP returns UNPROCESSABLE_SHORTENING with a reason per room, such as FLEX_CUTOFF_PASSED, NOT_SHORTENABLE, REFUND_WINDOW_PASSED, or SINGLE_NIGHT_BOOKING.

Arguments

NameDescription
booking_number* required
string

G- booking number from lodging_get_booking or the member. Not a contract number.

  • minLength: 1
rooms* required
object[]

One entry per room to shorten. Each entry sets check_in_date or check_out_date, not both.

  • minItems: 1
[{…}][
{
contract_number*string

Room contract number from lodging_get_booking: child_bookings[].contract_number when present, otherwise the top-level contract_number. Not the G- booking number.

  • minLength: 1
check_in_datestring

New check-in date as YYYY-MM-DD. Must be later than the current check-in. Omit when check_out_date is set.

  • minLength: 1
check_out_datestring

New check-out date as YYYY-MM-DD. Must be earlier than the current check-out. Omit when check_in_date is set.

  • minLength: 1
}
]
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "booking_number": "string",
      "rooms": [
        {
          "contract_number": "string",
          "check_in_date": "string",
          "check_out_date": "string"
        }
      ]
    },
    "name": "lodging_preview_shortening"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "booking_number": {
      "type": "string",
      "minLength": 1,
      "description": "G- booking number from lodging_get_booking or the member. Not a contract number."
    },
    "rooms": {
      "type": "array",
      "minItems": 1,
      "description": "One entry per room to shorten. Each entry sets check_in_date or check_out_date, not both.",
      "items": {
        "type": "object",
        "properties": {
          "contract_number": {
            "type": "string",
            "minLength": 1,
            "description": "Room contract number from lodging_get_booking: child_bookings[].contract_number when present, otherwise the top-level contract_number. Not the G- booking number."
          },
          "check_in_date": {
            "type": "string",
            "minLength": 1,
            "description": "New check-in date as YYYY-MM-DD. Must be later than the current check-in. Omit when check_out_date is set."
          },
          "check_out_date": {
            "type": "string",
            "minLength": 1,
            "description": "New check-out date as YYYY-MM-DD. Must be earlier than the current check-out. Omit when check_in_date is set."
          }
        },
        "required": [
          "contract_number"
        ]
      }
    }
  },
  "required": [
    "booking_number",
    "rooms"
  ]
}

Returns

{
  "_links": {
    "*": {
      "href": "string"
    }
  },
  "calculated_refund": {
    "amount_refundable": "string",
    "credit_card_refundable": "string",
    "direct_bill_refundable": "string",
    "refund_type": "original_form_of_payment",
    "reward_points_dollar_refundable": "string",
    "room_calculations": {
      "*": {
        "credit_card_refundable": "string",
        "direct_bill_refundable": "string",
        "refund_type": "original_form_of_payment",
        "refundable_amount": "string",
        "reward_points_dollar_refundable": "string",
        "travel_credit_refundable": "string"
      }
    },
    "travel_credit_refundable": "string"
  },
  "continuation_token": "string",
  "is_flex_covered": true,
  "is_hotel_collect": true,
  "is_refundable": true,
  "request_id": "string"
}
{
_linksobject

HAL links. The preview response is affordance-terminal — it carries no _templates. Commit the preview by calling lodging_submit_shortening with the continuation_token from this response (on the gateway wire, that is the discovery root's submit-shortening template).

{…}
{
< * >object

A HAL link.

{…}
{
href*string

Target of the link, relative to this API's base URL.

}
}
calculated_refund*object
{…}
{
amount_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

credit_card_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

direct_bill_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

refund_type*string
  • Available values: "original_form_of_payment", "travel_credit"
reward_points_dollar_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

room_calculations*object

Per-room refund breakdown, keyed by the room's contract number.

{…}
{
< * >object
{…}
{
credit_card_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

direct_bill_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

refund_type*string
  • Available values: "original_form_of_payment", "travel_credit"
refundable_amount*string

A decimal monetary amount represented as a string (e.g. "150.00").

reward_points_dollar_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

travel_credit_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

}
}
travel_credit_refundable*string

A decimal monetary amount represented as a string (e.g. "150.00").

}
continuation_token*string

Opaque token used to commit this preview via lodging_submit_shortening. Pass it through unchanged; it is single-use and time-limited.

is_flex_covered*boolean
is_hotel_collect*boolean
is_refundable*boolean
request_id*string
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "required": [
    "calculated_refund",
    "continuation_token",
    "is_flex_covered",
    "is_hotel_collect",
    "is_refundable",
    "request_id"
  ],
  "properties": {
    "_links": {
      "type": "object",
      "description": "HAL links. The preview response is affordance-terminal — it carries no `_templates`. Commit the preview by calling `lodging_submit_shortening` with the `continuation_token` from this response (on the gateway wire, that is the discovery root's `submit-shortening` template).",
      "additionalProperties": {
        "type": "object",
        "description": "A HAL link.",
        "required": [
          "href"
        ],
        "properties": {
          "href": {
            "type": "string",
            "description": "Target of the link, relative to this API's base URL."
          }
        }
      }
    },
    "calculated_refund": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "amount_refundable",
        "credit_card_refundable",
        "direct_bill_refundable",
        "refund_type",
        "reward_points_dollar_refundable",
        "room_calculations",
        "travel_credit_refundable"
      ],
      "properties": {
        "amount_refundable": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        },
        "credit_card_refundable": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        },
        "direct_bill_refundable": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        },
        "refund_type": {
          "type": "string",
          "enum": [
            "original_form_of_payment",
            "travel_credit"
          ]
        },
        "reward_points_dollar_refundable": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        },
        "room_calculations": {
          "type": "object",
          "description": "Per-room refund breakdown, keyed by the room's contract number.",
          "additionalProperties": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "credit_card_refundable",
              "direct_bill_refundable",
              "refund_type",
              "refundable_amount",
              "reward_points_dollar_refundable",
              "travel_credit_refundable"
            ],
            "properties": {
              "credit_card_refundable": {
                "type": "string",
                "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
              },
              "direct_bill_refundable": {
                "type": "string",
                "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
              },
              "refund_type": {
                "type": "string",
                "enum": [
                  "original_form_of_payment",
                  "travel_credit"
                ]
              },
              "refundable_amount": {
                "type": "string",
                "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
              },
              "reward_points_dollar_refundable": {
                "type": "string",
                "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
              },
              "travel_credit_refundable": {
                "type": "string",
                "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
              }
            }
          }
        },
        "travel_credit_refundable": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        }
      }
    },
    "continuation_token": {
      "type": "string",
      "description": "Opaque token used to commit this preview via `lodging_submit_shortening`. Pass it through unchanged; it is single-use and time-limited."
    },
    "is_flex_covered": {
      "type": "boolean"
    },
    "is_hotel_collect": {
      "type": "boolean"
    },
    "is_refundable": {
      "type": "boolean"
    },
    "request_id": {
      "type": "string"
    }
  }
}
READ lodging_resolve_destination Resolves a city, street address, ZIP code, venue, or landmark.

Read-only — returns data and changes nothing.

Resolves a city, street address, ZIP code, venue, or landmark. Call with a query to get up to three predictions and a sessionToken. If the intended place is evident, call again with that prediction's placeId and the response's sessionToken (each prediction's _links has this prefilled); if several could match, ask the user which; if none match, ask for a new query and call again. The selected place returns coordinates and locationKind for lodging_search_hotels. Saved favorites and phrases like 'the office' are not supported.

Arguments

NameDescription
query
string

City, street address, ZIP code, venue, or landmark. Omit when following a lodging_resolve_destination_N link.

  • minLength: 2
placeId
string

From a lodging_resolve_destination_N link

  • minLength: 1
sessionToken
string

From a lodging_resolve_destination_N link

  • minLength: 1
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "query": "string",
      "placeId": "string",
      "sessionToken": "string"
    },
    "name": "lodging_resolve_destination"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "query": {
      "description": "City, street address, ZIP code, venue, or landmark. Omit when following a `lodging_resolve_destination_N` link.",
      "type": "string",
      "minLength": 2
    },
    "placeId": {
      "description": "From a `lodging_resolve_destination_N` link",
      "type": "string",
      "minLength": 1
    },
    "sessionToken": {
      "description": "From a `lodging_resolve_destination_N` link",
      "type": "string",
      "minLength": 1
    }
  },
  "additionalProperties": false
}

Returns

{
  "data": {
    "query": "string",
    "sessionToken": "string",
    "predictions": [
      {
        "placeId": "string",
        "label": "string",
        "types": [
          "string"
        ],
        "_links": {
          "*": {
            "tool": "string",
            "href": "string",
            "method": "GET",
            "description": "string",
            "body": {
              "*": null
            },
            "required": [
              "string"
            ]
          }
        }
      }
    ],
    "ambiguous": true,
    "place": {
      "placeId": "string",
      "latitude": 0,
      "longitude": 0,
      "formattedAddress": "string",
      "types": [
        "string"
      ],
      "locationKind": "address"
    },
    "next": "string"
  },
  "_links": {
    "*": {
      "tool": "string",
      "href": "string",
      "method": "GET",
      "description": "string",
      "body": {
        "*": null
      },
      "required": [
        "string"
      ]
    }
  },
  "_handoff": {
    "*": {
      "href": "string",
      "description": "string"
    }
  }
}
{
data*object
{…}
{
querystring
sessionTokenstring

Send with the chosen prediction's placeId to resolve it.

predictionsobject[]
[{…}][
{
placeId*string
label*string
typesstring[]
_linksobject

lodging_resolve_destination prefilled with this row's placeId and the response's sessionToken.

{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
}
]
ambiguousboolean
placeobject
{…}
{
placeId*string
latitude*number
longitude*number
formattedAddress*string
typesstring[]
locationKind*string

address for a street address, venue, or landmark; area for a city, region, or ZIP. Send it to lodging_search_hotels.

  • Available values: "address", "area"
}
next*string

Instruction for the next call.

}
_links*object
{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
_handoffobject
{…}
{
< * >object
{…}
{
href*string
description*string
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "query": {
          "type": "string"
        },
        "sessionToken": {
          "description": "Send with the chosen prediction's placeId to resolve it.",
          "type": "string"
        },
        "predictions": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "placeId": {
                "type": "string"
              },
              "label": {
                "type": "string"
              },
              "types": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "_links": {
                "description": "lodging_resolve_destination prefilled with this row's placeId and the response's sessionToken.",
                "type": "object",
                "propertyNames": {
                  "type": "string"
                },
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "tool": {
                      "type": "string"
                    },
                    "href": {
                      "type": "string"
                    },
                    "method": {
                      "type": "string",
                      "enum": [
                        "GET",
                        "POST"
                      ]
                    },
                    "description": {
                      "type": "string"
                    },
                    "body": {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {}
                    },
                    "required": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "href",
                    "method",
                    "description"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "placeId",
              "label"
            ],
            "additionalProperties": false
          }
        },
        "ambiguous": {
          "type": "boolean"
        },
        "place": {
          "type": "object",
          "properties": {
            "placeId": {
              "type": "string"
            },
            "latitude": {
              "type": "number"
            },
            "longitude": {
              "type": "number"
            },
            "formattedAddress": {
              "type": "string"
            },
            "types": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "locationKind": {
              "type": "string",
              "enum": [
                "address",
                "area"
              ],
              "description": "address for a street address, venue, or landmark; area for a city, region, or ZIP. Send it to lodging_search_hotels."
            }
          },
          "required": [
            "placeId",
            "latitude",
            "longitude",
            "formattedAddress",
            "locationKind"
          ],
          "additionalProperties": false
        },
        "next": {
          "type": "string",
          "description": "Instruction for the next call."
        }
      },
      "required": [
        "next"
      ],
      "additionalProperties": false
    },
    "_links": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "tool": {
            "type": "string"
          },
          "href": {
            "type": "string"
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "POST"
            ]
          },
          "description": {
            "type": "string"
          },
          "body": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "required": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "href",
          "method",
          "description"
        ],
        "additionalProperties": false
      }
    },
    "_handoff": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "href",
          "description"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "data",
    "_links"
  ],
  "additionalProperties": false
}
READ lodging_search_hotels Searches bookable hotels for a location, dates, guestCount and roomCount.

Read-only — returns data and changes nothing.

Searches bookable hotels for a location, dates, guestCount and roomCount. Resolve relative dates from the current date in the context; if it is absent, ask the user for the year. Returns up to 10 available, in-policy rows (trimmed) ordered by personalization score, highest first. The score is Engine's prediction of what this traveler wants, based on their company's history and preferences. Present the top 3 by score to start and offer to narrow by price, distance, brand, rating, refundability, or amenities; filter the returned rows yourself, do not re-run the search unless dates, location, guests, or rooms change. Out-of-policy hotels are omitted and outOfPolicyCount says how many; mention it only if the user asks about a missing hotel or wants out-of-policy options, then send them to _handoff.open_search_in_engine to see and book those in Engine. Search takes 5 to 10 seconds. Each row's _links.lodging_get_room_rates is prefilled; criteria is also returned once at the top for re-runs. Show results as numbered text entries, never a table. Each entry: first the hotel name, starRating stars, and brand; then together price.nightlyBase per night, the nightly saving price.saveAmount (was price.strikeNightly) only when price has it, and price.total for the stay; then guestRating with reviewCount, whether refundable rates are available (refundable is about the hotel, not this price), up to 2 of amenities.primary, and city, plus distance only when criteria.locationKind is address. Keep amenities.other and the other displayFields.secondary values for follow-up questions instead of listing them. Keep this layout when you narrow or re-sort.

Arguments

NameDescription
latitude* required
number
longitude* required
number
locationDescription* required
string
checkIn* required
string

YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing.

  • pattern: "^\\d{4}-\\d{2}-\\d{2}$"
checkOut* required
string

YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing.

  • pattern: "^\\d{4}-\\d{2}-\\d{2}$"
roomCount* required
integer

Use 1 unless the user asks for more rooms. Do not ask.

  • minimum: 1
  • maximum: 8
guestCount* required
integer

Use 1 unless the user mentions other people. Do not ask.

  • minimum: 1
  • maximum: 14
radiusMiles
number
  • maximum: 50
locationKind
string

place.locationKind from lodging_resolve_destination; address searches show distance. Omit when unknown.

  • Available values: "address", "area"
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "latitude": 0,
      "longitude": 0,
      "locationDescription": "string",
      "checkIn": "string",
      "checkOut": "string",
      "roomCount": 1,
      "guestCount": 1,
      "radiusMiles": 0,
      "locationKind": "address"
    },
    "name": "lodging_search_hotels"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "latitude": {
      "type": "number"
    },
    "longitude": {
      "type": "number"
    },
    "locationDescription": {
      "type": "string"
    },
    "checkIn": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing."
    },
    "checkOut": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD. Resolve from the current date in the conversation or context. If the current date is not available, ask the user for the full date including the year rather than guessing."
    },
    "roomCount": {
      "type": "integer",
      "minimum": 1,
      "maximum": 8,
      "description": "Use 1 unless the user asks for more rooms. Do not ask."
    },
    "guestCount": {
      "type": "integer",
      "minimum": 1,
      "maximum": 14,
      "description": "Use 1 unless the user mentions other people. Do not ask."
    },
    "radiusMiles": {
      "type": "number",
      "exclusiveMinimum": 0,
      "maximum": 50
    },
    "locationKind": {
      "description": "`place.locationKind` from `lodging_resolve_destination`; address searches show distance. Omit when unknown.",
      "type": "string",
      "enum": [
        "address",
        "area"
      ]
    }
  },
  "required": [
    "latitude",
    "longitude",
    "locationDescription",
    "checkIn",
    "checkOut",
    "roomCount",
    "guestCount"
  ],
  "additionalProperties": false
}

Returns

{
  "data": {
    "searchId": "string",
    "legacySearchId": 0,
    "criteria": {
      "locationDescription": "string",
      "latitude": 0,
      "longitude": 0,
      "radiusMiles": 0,
      "checkIn": "string",
      "checkOut": "string",
      "roomCount": 0,
      "guestCount": 0,
      "locationKind": "address"
    },
    "datesNormalized": {
      "from": {
        "checkIn": "string",
        "checkOut": "string"
      },
      "to": {
        "checkIn": "string",
        "checkOut": "string"
      }
    },
    "displayFields": {
      "primary": [
        "string"
      ],
      "secondary": [
        "string"
      ]
    },
    "results": [
      {
        "propertyId": 0,
        "name": "string",
        "starRating": 0,
        "brand": "string",
        "price": {
          "nightlyBase": 0,
          "total": 0,
          "currency": "string",
          "taxesAndFees": 0,
          "strikeNightly": 0,
          "saveAmount": 0,
          "savePercent": 0
        },
        "guestRating": 0,
        "reviewCount": 0,
        "refundable": true,
        "amenities": {
          "primary": [
            "breakfast"
          ],
          "other": [
            "string"
          ]
        },
        "city": "string",
        "distance": 0,
        "distanceUnit": "string",
        "loyaltyEligible": true,
        "bookedBefore": true,
        "policy": "in_policy",
        "score": 0,
        "_links": {
          "lodging_get_room_rates": {
            "tool": "string",
            "href": "string",
            "method": "GET",
            "description": "string",
            "body": {
              "propertyId": 0,
              "roomOffersToken": "string",
              "criteria": {
                "locationDescription": "string",
                "latitude": 0,
                "longitude": 0,
                "radiusMiles": 0,
                "checkIn": "string",
                "checkOut": "string",
                "roomCount": 0,
                "guestCount": 0,
                "locationKind": "address"
              },
              "hotel": {
                "name": "string",
                "amenities": {
                  "primary": [
                    "breakfast"
                  ],
                  "other": [
                    "string"
                  ]
                }
              }
            },
            "required": [
              "string"
            ]
          }
        }
      }
    ],
    "total": 0,
    "outOfPolicyCount": 0,
    "noResultsReason": "international_restricted",
    "notice": "string",
    "next": "string"
  },
  "_links": {
    "*": {
      "tool": "string",
      "href": "string",
      "method": "GET",
      "description": "string",
      "body": {
        "*": null
      },
      "required": [
        "string"
      ]
    }
  },
  "_handoff": {
    "*": {
      "href": "string",
      "description": "string"
    }
  }
}
{
data*object
{…}
{
searchId*string
legacySearchIdinteger
criteria*object
{…}
{
locationDescription*string
latitude*number
longitude*number
radiusMilesnumber
checkIn*string
checkOut*string
roomCount*integer
guestCount*integer
locationKindstring
  • Available values: "address", "area"
}
datesNormalizedobject

Present when a prior-year stay was moved into the current year; criteria holds the moved dates.

{…}
{
from*object
{…}
{
checkIn*string
checkOut*string
}
to*object
{…}
{
checkIn*string
checkOut*string
}
}
displayFields*object

Dotted paths into each row. Show primary in every entry, in this order; keep secondary for follow-up questions.

{…}
{
primary*string[]
secondary*string[]
}
results*object[]
[{…}][
{
propertyId*integer
name*string
starRating*number | null
brand*string | null
price*object
{…}
{
nightlyBase*number | null

Nightly rate before taxes and fees; null with total.

total*number | null

Stay total, taxes and fees included; null with nightlyBase.

currencystring

Omitted when the backend sent none: show the amounts without a currency, never guess one.

taxesAndFeesnumber

Stay taxes and fees, when the tool knows them.

strikeNightlynumber

Nightly price before the saving. Present with saveAmount.

saveAmountnumber

Nightly saving. Omitted when there is none worth showing (under 5 and under 10%) or the rate is a negotiated program rate.

savePercentinteger

Nightly saving in whole percent. Only with saveAmount, and omitted when it cannot be known or rounds to 0.

}
guestRating*number | null
reviewCount*number | null
refundable*boolean
amenities*object
{…}
{
primary*string[]

Free breakfast, free parking, free wifi, when offered.

other*string[]

Other offered amenities from a fixed set (fitnessCenter, swimmingPool, petFriendly, shuttle, kitchen, airConditioning, truckParking); not exhaustive. For follow-up questions.

}
city*string
distance*number

From the searched location. Primary for an address search, secondary for an area search.

distanceUnit*string
loyaltyEligible*boolean
bookedBefore*boolean
policy*string
  • Available values: "in_policy", "out_of_policy", "unknown"
score*number
_linksobject
{…}
{
lodging_get_room_rates*object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
propertyId*integer
roomOffersToken*string
criteria*object
{…}
{
locationDescription*string
latitude*number
longitude*number
radiusMilesnumber
checkIn*string
checkOut*string
roomCount*integer
guestCount*integer
locationKindstring
  • Available values: "address", "area"
}
hotel*object
{…}
{
name*string
amenities*object
{…}
{
primary*string[]

Free breakfast, free parking, free wifi, when offered.

other*string[]

Other offered amenities from a fixed set (fitnessCenter, swimmingPool, petFriendly, shuttle, kitchen, airConditioning, truckParking); not exhaustive. For follow-up questions.

}
}
}
requiredstring[]
}
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
}
]
total*integer
outOfPolicyCount*integer

Out-of-policy hotels omitted from results.

noResultsReasonstring

Present only with zero results, when the company does not allow international travel.

noticestring

What to tell the user when noResultsReason is set; follow it instead of retrying.

next*string

Instruction for the next call.

}
_links*object
{…}
{
< * >object
{…}
{
toolstring
href*string
method*string
  • Available values: "GET", "POST"
description*string
bodyobject
{…}
{
< * >any
}
requiredstring[]
}
}
_handoffobject
{…}
{
< * >object
{…}
{
href*string
description*string
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "data": {
      "type": "object",
      "properties": {
        "searchId": {
          "type": "string"
        },
        "legacySearchId": {
          "type": "integer"
        },
        "criteria": {
          "type": "object",
          "properties": {
            "locationDescription": {
              "type": "string"
            },
            "latitude": {
              "type": "number"
            },
            "longitude": {
              "type": "number"
            },
            "radiusMiles": {
              "type": "number"
            },
            "checkIn": {
              "type": "string"
            },
            "checkOut": {
              "type": "string"
            },
            "roomCount": {
              "type": "integer"
            },
            "guestCount": {
              "type": "integer"
            },
            "locationKind": {
              "type": "string",
              "enum": [
                "address",
                "area"
              ]
            }
          },
          "required": [
            "locationDescription",
            "latitude",
            "longitude",
            "checkIn",
            "checkOut",
            "roomCount",
            "guestCount"
          ],
          "additionalProperties": false
        },
        "datesNormalized": {
          "description": "Present when a prior-year stay was moved into the current year; criteria holds the moved dates.",
          "type": "object",
          "properties": {
            "from": {
              "type": "object",
              "properties": {
                "checkIn": {
                  "type": "string"
                },
                "checkOut": {
                  "type": "string"
                }
              },
              "required": [
                "checkIn",
                "checkOut"
              ],
              "additionalProperties": false
            },
            "to": {
              "type": "object",
              "properties": {
                "checkIn": {
                  "type": "string"
                },
                "checkOut": {
                  "type": "string"
                }
              },
              "required": [
                "checkIn",
                "checkOut"
              ],
              "additionalProperties": false
            }
          },
          "required": [
            "from",
            "to"
          ],
          "additionalProperties": false
        },
        "displayFields": {
          "type": "object",
          "properties": {
            "primary": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "secondary": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          },
          "required": [
            "primary",
            "secondary"
          ],
          "additionalProperties": false,
          "description": "Dotted paths into each row. Show primary in every entry, in this order; keep secondary for follow-up questions."
        },
        "results": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "propertyId": {
                "type": "integer"
              },
              "name": {
                "type": "string"
              },
              "starRating": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "brand": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "price": {
                "type": "object",
                "properties": {
                  "nightlyBase": {
                    "description": "Nightly rate before taxes and fees; null with total.",
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "total": {
                    "description": "Stay total, taxes and fees included; null with nightlyBase.",
                    "type": [
                      "number",
                      "null"
                    ]
                  },
                  "currency": {
                    "description": "Omitted when the backend sent none: show the amounts without a currency, never guess one.",
                    "type": "string"
                  },
                  "taxesAndFees": {
                    "description": "Stay taxes and fees, when the tool knows them.",
                    "type": "number"
                  },
                  "strikeNightly": {
                    "description": "Nightly price before the saving. Present with saveAmount.",
                    "type": "number"
                  },
                  "saveAmount": {
                    "description": "Nightly saving. Omitted when there is none worth showing (under 5 and under 10%) or the rate is a negotiated program rate.",
                    "type": "number"
                  },
                  "savePercent": {
                    "description": "Nightly saving in whole percent. Only with saveAmount, and omitted when it cannot be known or rounds to 0.",
                    "type": "integer"
                  }
                },
                "required": [
                  "nightlyBase",
                  "total"
                ],
                "additionalProperties": false
              },
              "guestRating": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "reviewCount": {
                "type": [
                  "number",
                  "null"
                ]
              },
              "refundable": {
                "type": "boolean"
              },
              "amenities": {
                "type": "object",
                "properties": {
                  "primary": {
                    "type": "array",
                    "items": {
                      "type": "string",
                      "enum": [
                        "breakfast",
                        "parking",
                        "wifi"
                      ]
                    },
                    "description": "Free breakfast, free parking, free wifi, when offered."
                  },
                  "other": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Other offered amenities from a fixed set (fitnessCenter, swimmingPool, petFriendly, shuttle, kitchen, airConditioning, truckParking); not exhaustive. For follow-up questions."
                  }
                },
                "required": [
                  "primary",
                  "other"
                ],
                "additionalProperties": false
              },
              "city": {
                "type": "string"
              },
              "distance": {
                "type": "number",
                "description": "From the searched location. Primary for an address search, secondary for an area search."
              },
              "distanceUnit": {
                "type": "string"
              },
              "loyaltyEligible": {
                "type": "boolean"
              },
              "bookedBefore": {
                "type": "boolean"
              },
              "policy": {
                "type": "string",
                "enum": [
                  "in_policy",
                  "out_of_policy",
                  "unknown"
                ]
              },
              "score": {
                "type": "number"
              },
              "_links": {
                "type": "object",
                "properties": {
                  "lodging_get_room_rates": {
                    "type": "object",
                    "properties": {
                      "tool": {
                        "type": "string"
                      },
                      "href": {
                        "type": "string"
                      },
                      "method": {
                        "type": "string",
                        "enum": [
                          "GET",
                          "POST"
                        ]
                      },
                      "description": {
                        "type": "string"
                      },
                      "body": {
                        "type": "object",
                        "properties": {
                          "propertyId": {
                            "type": "integer"
                          },
                          "roomOffersToken": {
                            "type": "string",
                            "x-engine/opaqueReference": true
                          },
                          "criteria": {
                            "type": "object",
                            "properties": {
                              "locationDescription": {
                                "type": "string"
                              },
                              "latitude": {
                                "type": "number"
                              },
                              "longitude": {
                                "type": "number"
                              },
                              "radiusMiles": {
                                "type": "number"
                              },
                              "checkIn": {
                                "type": "string"
                              },
                              "checkOut": {
                                "type": "string"
                              },
                              "roomCount": {
                                "type": "integer"
                              },
                              "guestCount": {
                                "type": "integer"
                              },
                              "locationKind": {
                                "type": "string",
                                "enum": [
                                  "address",
                                  "area"
                                ]
                              }
                            },
                            "required": [
                              "locationDescription",
                              "latitude",
                              "longitude",
                              "checkIn",
                              "checkOut",
                              "roomCount",
                              "guestCount"
                            ],
                            "additionalProperties": false
                          },
                          "hotel": {
                            "type": "object",
                            "properties": {
                              "name": {
                                "type": "string"
                              },
                              "amenities": {
                                "type": "object",
                                "properties": {
                                  "primary": {
                                    "type": "array",
                                    "items": {
                                      "type": "string",
                                      "enum": [
                                        "breakfast",
                                        "parking",
                                        "wifi"
                                      ]
                                    },
                                    "description": "Free breakfast, free parking, free wifi, when offered."
                                  },
                                  "other": {
                                    "type": "array",
                                    "items": {
                                      "type": "string"
                                    },
                                    "description": "Other offered amenities from a fixed set (fitnessCenter, swimmingPool, petFriendly, shuttle, kitchen, airConditioning, truckParking); not exhaustive. For follow-up questions."
                                  }
                                },
                                "required": [
                                  "primary",
                                  "other"
                                ],
                                "additionalProperties": false
                              }
                            },
                            "required": [
                              "name",
                              "amenities"
                            ],
                            "additionalProperties": false
                          }
                        },
                        "required": [
                          "propertyId",
                          "roomOffersToken",
                          "criteria",
                          "hotel"
                        ],
                        "additionalProperties": false
                      },
                      "required": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        }
                      }
                    },
                    "required": [
                      "href",
                      "method",
                      "description"
                    ],
                    "additionalProperties": false
                  }
                },
                "required": [
                  "lodging_get_room_rates"
                ],
                "additionalProperties": {
                  "type": "object",
                  "properties": {
                    "tool": {
                      "type": "string"
                    },
                    "href": {
                      "type": "string"
                    },
                    "method": {
                      "type": "string",
                      "enum": [
                        "GET",
                        "POST"
                      ]
                    },
                    "description": {
                      "type": "string"
                    },
                    "body": {
                      "type": "object",
                      "propertyNames": {
                        "type": "string"
                      },
                      "additionalProperties": {}
                    },
                    "required": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      }
                    }
                  },
                  "required": [
                    "href",
                    "method",
                    "description"
                  ],
                  "additionalProperties": false
                }
              }
            },
            "required": [
              "propertyId",
              "name",
              "starRating",
              "brand",
              "price",
              "guestRating",
              "reviewCount",
              "refundable",
              "amenities",
              "city",
              "distance",
              "distanceUnit",
              "loyaltyEligible",
              "bookedBefore",
              "policy",
              "score"
            ],
            "additionalProperties": false
          }
        },
        "total": {
          "type": "integer"
        },
        "outOfPolicyCount": {
          "type": "integer",
          "description": "Out-of-policy hotels omitted from results."
        },
        "noResultsReason": {
          "description": "Present only with zero results, when the company does not allow international travel.",
          "type": "string",
          "const": "international_restricted"
        },
        "notice": {
          "description": "What to tell the user when noResultsReason is set; follow it instead of retrying.",
          "type": "string"
        },
        "next": {
          "type": "string",
          "description": "Instruction for the next call."
        }
      },
      "required": [
        "searchId",
        "criteria",
        "displayFields",
        "results",
        "total",
        "outOfPolicyCount",
        "next"
      ],
      "additionalProperties": false
    },
    "_links": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "tool": {
            "type": "string"
          },
          "href": {
            "type": "string"
          },
          "method": {
            "type": "string",
            "enum": [
              "GET",
              "POST"
            ]
          },
          "description": {
            "type": "string"
          },
          "body": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "required": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "href",
          "method",
          "description"
        ],
        "additionalProperties": false
      }
    },
    "_handoff": {
      "type": "object",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "object",
        "properties": {
          "href": {
            "type": "string"
          },
          "description": {
            "type": "string"
          }
        },
        "required": [
          "href",
          "description"
        ],
        "additionalProperties": false
      }
    }
  },
  "required": [
    "data",
    "_links"
  ],
  "additionalProperties": false
}
DESTRUCTIVE lodging_submit_cancellation Cancels the rooms in a cancellation preview and issues the refund.

Destructive — can delete data or make irreversible changes.

Cancels the rooms in a cancellation preview and issues the refund. Call it only with a continuation_token from lodging_preview_cancellation, after the member confirmed those terms. Returns the cancelled contract numbers, the refund, and any penalty. Errors: - CANCELLATION_OUTCOME_UNKNOWN: the cancellation may have gone through. Do not call lodging_submit_cancellation again. Call lodging_preview_cancellation for the same rooms. BOOKING_ALREADY_CANCELLED from that preview means the cancellation succeeded - CANCELLATION_FAILED: do not retry. Offer the member a handoff to support - CANCELLATION_IN_PROGRESS: another cancellation is running for this booking. Do not call lodging_submit_cancellation again - CANCELLATION_POLICY_CHANGED or INVALID_CONTINUATION_TOKEN: call lodging_preview_cancellation again and get the member's confirmation of the new terms

Arguments

NameDescription
booking_number* required
string

G- booking number. Must match the booking the continuation_token was issued for.

  • minLength: 1
continuation_token* required
string

continuation_token from the lodging_preview_cancellation response. Pass it unchanged. It is single-use and expires.

  • minLength: 1
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "booking_number": "string",
      "continuation_token": "string"
    },
    "name": "lodging_submit_cancellation"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "booking_number": {
      "type": "string",
      "minLength": 1,
      "description": "G- booking number. Must match the booking the continuation_token was issued for."
    },
    "continuation_token": {
      "type": "string",
      "minLength": 1,
      "description": "continuation_token from the lodging_preview_cancellation response. Pass it unchanged. It is single-use and expires."
    }
  },
  "required": [
    "booking_number",
    "continuation_token"
  ]
}

Returns

{
  "_links": {
    "*": {
      "href": "string"
    }
  },
  "booking_number": "string",
  "is_flex_covered": true,
  "penalty": {
    "amount": {
      "amount": "string",
      "currency": "string"
    },
    "is_flex_covered": true,
    "nights_penalty": 0
  },
  "refund": {
    "total": {
      "amount": "string",
      "currency": "string"
    },
    "methods": [
      {
        "type": "credit_card",
        "amount": {
          "amount": "string",
          "currency": "string"
        }
      }
    ]
  },
  "rooms": [
    {
      "contract_number": "string",
      "refund_total": {
        "amount": "string",
        "currency": "string"
      },
      "penalty": {
        "amount": "string",
        "currency": "string"
      }
    }
  ],
  "cancelled_contract_numbers": [
    "string"
  ],
  "request_id": "string"
}
{
_linksobject

HAL links. This response is terminal — it carries no _templates — but booking-permissions links back to the booking so a consumer can call lodging_get_booking again without returning to the discovery root.

{…}
{
< * >object

A HAL link.

{…}
{
href*string

Target of the link, relative to this API's base URL.

}
}
booking_number*string

The booking the cancellation is for.

is_flex_covered*boolean

Whether Flex coverage applied to the cancelled rooms' cancellation policy.

penalty*object | null

Cancellation penalty charged, or null when there was none.

{…}
{
amount*object

Penalty amount for the selected rooms.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
is_flex_covered*boolean

Whether Flex coverage absorbs the penalty.

nights_penalty*integer | null

Number of nights the penalty is based on, or null when it is not night-based.

}
refund*object | null

Refund for the cancelled rooms, or null when no refund is issued (for example, a pay-later booking).

{…}
{
total*object

Total refund across all destinations.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
methods*object[]

Refund destinations with a positive amount. A destination receiving nothing is omitted.

[{…}][
{
type*string

Where this part of the refund goes.

  • Available values: "credit_card", "direct_bill", "reward_points", "travel_credits"
amount*object

Amount refunded to this destination. Always positive.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
}
]
}
rooms*object[]

Per-room breakdown of the plan that was carried out.

[{…}][
{
contract_number*string

The room's contract number, as sent in the request.

refund_total*object | null

Refund for this room. Null exactly when the top-level refund is null (no refund is issued, e.g. a pay-later booking), so "no refund" stays distinct from a zero refund.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
penalty*object | null

This room's share of the top-level penalty, before any Flex coverage, or null when the room bears none. The shares sum to penalty.amount.

{…}
{
amount*string

Decimal amount as a string (e.g. "150.00").

currency*string

ISO 4217 currency code (e.g. "USD").

}
}
]
cancelled_contract_numbers*string[]

Contract numbers of the rooms this request cancelled.

request_id*string
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "required": [
    "booking_number",
    "is_flex_covered",
    "penalty",
    "refund",
    "rooms",
    "cancelled_contract_numbers",
    "request_id"
  ],
  "properties": {
    "_links": {
      "type": "object",
      "description": "HAL links. This response is terminal — it carries no `_templates` — but `booking-permissions` links back to the booking so a consumer can call `lodging_get_booking` again without returning to the discovery root.",
      "additionalProperties": {
        "type": "object",
        "description": "A HAL link.",
        "required": [
          "href"
        ],
        "properties": {
          "href": {
            "type": "string",
            "description": "Target of the link, relative to this API's base URL."
          }
        }
      }
    },
    "booking_number": {
      "type": "string",
      "description": "The booking the cancellation is for."
    },
    "is_flex_covered": {
      "type": "boolean",
      "description": "Whether Flex coverage applied to the cancelled rooms' cancellation policy."
    },
    "penalty": {
      "description": "Cancellation penalty charged, or null when there was none.",
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": false,
      "required": [
        "amount",
        "is_flex_covered",
        "nights_penalty"
      ],
      "properties": {
        "amount": {
          "description": "Penalty amount for the selected rooms.",
          "type": "object",
          "additionalProperties": false,
          "required": [
            "amount",
            "currency"
          ],
          "properties": {
            "amount": {
              "type": "string",
              "description": "Decimal amount as a string (e.g. \"150.00\")."
            },
            "currency": {
              "type": "string",
              "description": "ISO 4217 currency code (e.g. \"USD\")."
            }
          }
        },
        "is_flex_covered": {
          "type": "boolean",
          "description": "Whether Flex coverage absorbs the penalty."
        },
        "nights_penalty": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Number of nights the penalty is based on, or null when it is not night-based."
        }
      }
    },
    "refund": {
      "description": "Refund for the cancelled rooms, or null when no refund is issued (for example, a pay-later booking).",
      "type": [
        "object",
        "null"
      ],
      "additionalProperties": false,
      "required": [
        "total",
        "methods"
      ],
      "properties": {
        "total": {
          "description": "Total refund across all destinations.",
          "type": "object",
          "additionalProperties": false,
          "required": [
            "amount",
            "currency"
          ],
          "properties": {
            "amount": {
              "type": "string",
              "description": "Decimal amount as a string (e.g. \"150.00\")."
            },
            "currency": {
              "type": "string",
              "description": "ISO 4217 currency code (e.g. \"USD\")."
            }
          }
        },
        "methods": {
          "type": "array",
          "description": "Refund destinations with a positive amount. A destination receiving nothing is omitted.",
          "items": {
            "type": "object",
            "additionalProperties": false,
            "required": [
              "type",
              "amount"
            ],
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "credit_card",
                  "direct_bill",
                  "reward_points",
                  "travel_credits"
                ],
                "description": "Where this part of the refund goes."
              },
              "amount": {
                "description": "Amount refunded to this destination. Always positive.",
                "type": "object",
                "additionalProperties": false,
                "required": [
                  "amount",
                  "currency"
                ],
                "properties": {
                  "amount": {
                    "type": "string",
                    "description": "Decimal amount as a string (e.g. \"150.00\")."
                  },
                  "currency": {
                    "type": "string",
                    "description": "ISO 4217 currency code (e.g. \"USD\")."
                  }
                }
              }
            }
          }
        }
      }
    },
    "rooms": {
      "type": "array",
      "description": "Per-room breakdown of the plan that was carried out.",
      "items": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "contract_number",
          "refund_total",
          "penalty"
        ],
        "properties": {
          "contract_number": {
            "type": "string",
            "description": "The room's contract number, as sent in the request."
          },
          "refund_total": {
            "description": "Refund for this room. Null exactly when the top-level `refund` is null (no refund is issued, e.g. a pay-later booking), so \"no refund\" stays distinct from a zero refund.",
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": false,
            "required": [
              "amount",
              "currency"
            ],
            "properties": {
              "amount": {
                "type": "string",
                "description": "Decimal amount as a string (e.g. \"150.00\")."
              },
              "currency": {
                "type": "string",
                "description": "ISO 4217 currency code (e.g. \"USD\")."
              }
            }
          },
          "penalty": {
            "description": "This room's share of the top-level penalty, before any Flex coverage, or null when the room bears none. The shares sum to `penalty.amount`.",
            "type": [
              "object",
              "null"
            ],
            "additionalProperties": false,
            "required": [
              "amount",
              "currency"
            ],
            "properties": {
              "amount": {
                "type": "string",
                "description": "Decimal amount as a string (e.g. \"150.00\")."
              },
              "currency": {
                "type": "string",
                "description": "ISO 4217 currency code (e.g. \"USD\")."
              }
            }
          }
        }
      }
    },
    "cancelled_contract_numbers": {
      "type": "array",
      "description": "Contract numbers of the rooms this request cancelled.",
      "items": {
        "type": "string"
      }
    },
    "request_id": {
      "type": "string"
    }
  }
}
DESTRUCTIVE lodging_submit_shortening Moves the check-in or check-out dates in a shortening preview and issues the refund.

Destructive — can delete data or make irreversible changes.

Moves the check-in or check-out dates in a shortening preview and issues the refund. Call it only with a continuation_token from lodging_preview_shortening, after the member confirmed those terms. Returns the refund issued, by payment type. Errors: - UNPROCESSABLE_SHORTENING: the MCP could not apply the change. Show the member the reason and do not retry

Arguments

NameDescription
booking_number* required
string

G- booking number. Must match the booking the continuation_token was issued for.

  • minLength: 1
continuation_token* required
string

continuation_token from the lodging_preview_shortening response. Pass it unchanged. It is single-use and expires.

  • minLength: 1
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "booking_number": "string",
      "continuation_token": "string"
    },
    "name": "lodging_submit_shortening"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "booking_number": {
      "type": "string",
      "minLength": 1,
      "description": "G- booking number. Must match the booking the continuation_token was issued for."
    },
    "continuation_token": {
      "type": "string",
      "minLength": 1,
      "description": "continuation_token from the lodging_preview_shortening response. Pass it unchanged. It is single-use and expires."
    }
  },
  "required": [
    "booking_number",
    "continuation_token"
  ]
}

Returns

{
  "_links": {
    "*": {
      "href": "string"
    }
  },
  "issued_refund": {
    "amount_refunded": "string",
    "credit_card_refunded": "string",
    "direct_bill_refunded": "string",
    "refund_type": "original_form_of_payment",
    "reward_points_dollar_refunded": "string",
    "travel_credit_refunded": "string"
  },
  "request_id": "string"
}
{
_linksobject

HAL links. This response is terminal — it carries no _templates — but booking-permissions links back to the booking so a consumer can call lodging_get_booking again without returning to the discovery root.

{…}
{
< * >object

A HAL link.

{…}
{
href*string

Target of the link, relative to this API's base URL.

}
}
issued_refund*object
{…}
{
amount_refunded*string

A decimal monetary amount represented as a string (e.g. "150.00").

credit_card_refunded*string

A decimal monetary amount represented as a string (e.g. "150.00").

direct_bill_refunded*string

A decimal monetary amount represented as a string (e.g. "150.00").

refund_type*string
  • Available values: "original_form_of_payment", "travel_credit"
reward_points_dollar_refunded*string

A decimal monetary amount represented as a string (e.g. "150.00").

travel_credit_refunded*string

A decimal monetary amount represented as a string (e.g. "150.00").

}
request_id*string
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false,
  "required": [
    "issued_refund",
    "request_id"
  ],
  "properties": {
    "_links": {
      "type": "object",
      "description": "HAL links. This response is terminal — it carries no `_templates` — but `booking-permissions` links back to the booking so a consumer can call `lodging_get_booking` again without returning to the discovery root.",
      "additionalProperties": {
        "type": "object",
        "description": "A HAL link.",
        "required": [
          "href"
        ],
        "properties": {
          "href": {
            "type": "string",
            "description": "Target of the link, relative to this API's base URL."
          }
        }
      }
    },
    "issued_refund": {
      "type": "object",
      "additionalProperties": false,
      "required": [
        "amount_refunded",
        "credit_card_refunded",
        "direct_bill_refunded",
        "refund_type",
        "reward_points_dollar_refunded",
        "travel_credit_refunded"
      ],
      "properties": {
        "amount_refunded": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        },
        "credit_card_refunded": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        },
        "direct_bill_refunded": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        },
        "refund_type": {
          "type": "string",
          "enum": [
            "original_form_of_payment",
            "travel_credit"
          ]
        },
        "reward_points_dollar_refunded": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        },
        "travel_credit_refunded": {
          "type": "string",
          "description": "A decimal monetary amount represented as a string (e.g. \"150.00\")."
        }
      }
    },
    "request_id": {
      "type": "string"
    }
  }
}
READ support_get_case Returns the full record for one of the member's customer-visible support cases: type, subject, description, status, history, customer comments, notes, payment status, and the related booking.

Read-only — returns data and changes nothing.

Returns the full record for one of the member's customer-visible support cases: type, subject, description, status, history, customer comments, notes, payment status, and the related booking. Use it when the member has a case number and needs more than status. For status only, call support_get_case_status. Cases the member cannot see return not found.

Arguments

NameDescription
case_number* required
string

Salesforce case number, for example 00001234, from support_list_cases or the member.

  • minLength: 1
  • maxLength: 80
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "case_number": "string"
    },
    "name": "support_get_case"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "case_number": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Salesforce case number, for example 00001234, from support_list_cases or the member."
    }
  },
  "required": [
    "case_number"
  ],
  "additionalProperties": false
}

Returns

{
  "case_number": "string",
  "booking_id": "string",
  "type": "string",
  "subject": "string",
  "description": "string",
  "origin": "string",
  "subtype": "string",
  "type_reason": "string",
  "status": "string",
  "is_closed": true,
  "is_escalated": true,
  "filed_at": "string",
  "closed_at": "string",
  "last_updated_at": "string",
  "case_history": "string",
  "customer_comments": "string",
  "case_notes": "string",
  "payment_status": "string",
  "_links": {
    "self": {
      "href": "string",
      "templated": true
    },
    "status": {
      "href": "string",
      "templated": true
    },
    "cases": {
      "href": "/support/v1/cases{?booking_reference,type,since,page}",
      "templated": true
    }
  }
}
{
case_number*string
booking_id*string | null

Engine booking / contract number, or null when unset. Same value support_list_cases accepts as booking_reference.

type*string | null
subject*string | null
description*string | null
origin*string | null
subtype*string | null
type_reason*string | null

Case type reason from Salesforce (Type_Reason__c), or null when unset. Distinct from the unused standard Case.Reason field.

status*string
is_closed*boolean
is_escalated*boolean
filed_at*string

Salesforce CreatedDate, passed through. Often …+0000 (no colon in the offset) — not strict RFC 3339, so no format: date-time.

closed_at*string | null

Salesforce ClosedDate when set, else null. Same …+0000 wire form as filed_at when present.

last_updated_at*string

Salesforce LastModifiedDate, passed through. Same …+0000 wire form as filed_at.

case_history*string | null
customer_comments*string | null
case_notes*string | null
payment_status*string | null
_links*object
{…}
{
self*object
{…}
{
href*string
templatedboolean

True when href is an RFC 6570 URI template.

}
status*object
{…}
{
href*string
templatedboolean

True when href is an RFC 6570 URI template.

}
cases*object
{…}
{
href*string
  • Example: "/support/v1/cases{?booking_reference,type,since,page}"
templated*boolean
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "case_number",
    "booking_id",
    "type",
    "subject",
    "description",
    "origin",
    "subtype",
    "type_reason",
    "status",
    "is_closed",
    "is_escalated",
    "filed_at",
    "closed_at",
    "last_updated_at",
    "case_history",
    "customer_comments",
    "case_notes",
    "payment_status",
    "_links"
  ],
  "properties": {
    "case_number": {
      "type": "string"
    },
    "booking_id": {
      "type": [
        "string",
        "null"
      ],
      "description": "Engine booking / contract number, or null when unset. Same value `support_list_cases` accepts as `booking_reference`."
    },
    "type": {
      "type": [
        "string",
        "null"
      ]
    },
    "subject": {
      "type": [
        "string",
        "null"
      ]
    },
    "description": {
      "type": [
        "string",
        "null"
      ]
    },
    "origin": {
      "type": [
        "string",
        "null"
      ]
    },
    "subtype": {
      "type": [
        "string",
        "null"
      ]
    },
    "type_reason": {
      "type": [
        "string",
        "null"
      ],
      "description": "Case type reason from Salesforce (`Type_Reason__c`), or null when unset. Distinct from the unused standard Case.Reason field."
    },
    "status": {
      "type": "string"
    },
    "is_closed": {
      "type": "boolean"
    },
    "is_escalated": {
      "type": "boolean"
    },
    "filed_at": {
      "type": "string",
      "description": "Salesforce CreatedDate, passed through. Often `…+0000` (no colon in the offset) — not strict RFC 3339, so no `format: date-time`."
    },
    "closed_at": {
      "type": [
        "string",
        "null"
      ],
      "description": "Salesforce ClosedDate when set, else null. Same `…+0000` wire form as `filed_at` when present."
    },
    "last_updated_at": {
      "type": "string",
      "description": "Salesforce LastModifiedDate, passed through. Same `…+0000` wire form as `filed_at`."
    },
    "case_history": {
      "type": [
        "string",
        "null"
      ]
    },
    "customer_comments": {
      "type": [
        "string",
        "null"
      ]
    },
    "case_notes": {
      "type": [
        "string",
        "null"
      ]
    },
    "payment_status": {
      "type": [
        "string",
        "null"
      ]
    },
    "_links": {
      "type": "object",
      "required": [
        "self",
        "status",
        "cases"
      ],
      "properties": {
        "self": {
          "type": "object",
          "required": [
            "href"
          ],
          "properties": {
            "href": {
              "type": "string"
            },
            "templated": {
              "type": "boolean",
              "description": "True when `href` is an RFC 6570 URI template."
            }
          }
        },
        "status": {
          "type": "object",
          "required": [
            "href"
          ],
          "properties": {
            "href": {
              "type": "string"
            },
            "templated": {
              "type": "boolean",
              "description": "True when `href` is an RFC 6570 URI template."
            }
          }
        },
        "cases": {
          "type": "object",
          "required": [
            "href",
            "templated"
          ],
          "properties": {
            "href": {
              "type": "string",
              "example": "/support/v1/cases{?booking_reference,type,since,page}"
            },
            "templated": {
              "type": "boolean",
              "const": true
            }
          }
        }
      }
    }
  }
}
READ support_get_case_status Returns the type, status, is_closed, and last_updated_at for one of the member's customer-visible support cases, with no free-text fields.

Read-only — returns data and changes nothing.

Returns the type, status, is_closed, and last_updated_at for one of the member's customer-visible support cases, with no free-text fields. Use it when the member has a case number and only needs status. For the full record, call support_get_case. Cases the member cannot see return not found.

Arguments

NameDescription
case_number* required
string

Salesforce case number, for example 00001234, from support_list_cases or the member.

  • minLength: 1
  • maxLength: 80
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "case_number": "string"
    },
    "name": "support_get_case_status"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "case_number": {
      "type": "string",
      "minLength": 1,
      "maxLength": 80,
      "description": "Salesforce case number, for example 00001234, from support_list_cases or the member."
    }
  },
  "required": [
    "case_number"
  ],
  "additionalProperties": false
}

Returns

{
  "case_number": "string",
  "type": "string",
  "status": "string",
  "is_closed": true,
  "last_updated_at": "string",
  "_links": {
    "self": {
      "href": "string",
      "templated": true
    },
    "case": {
      "href": "string",
      "templated": true
    },
    "cases": {
      "href": "string",
      "templated": true
    }
  }
}
{
case_number*string
type*string | null
status*string
is_closed*boolean
last_updated_at*string

Salesforce LastModifiedDate, passed through. Often …+0000 (no colon in the offset) — not strict RFC 3339, so no format: date-time.

_links*object
{…}
{
self*object
{…}
{
href*string
templatedboolean

True when href is an RFC 6570 URI template.

}
case*object
{…}
{
href*string
templatedboolean

True when href is an RFC 6570 URI template.

}
cases*object
{…}
{
href*string
templated*boolean
}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "case_number",
    "type",
    "status",
    "is_closed",
    "last_updated_at",
    "_links"
  ],
  "properties": {
    "case_number": {
      "type": "string"
    },
    "type": {
      "type": [
        "string",
        "null"
      ]
    },
    "status": {
      "type": "string"
    },
    "is_closed": {
      "type": "boolean"
    },
    "last_updated_at": {
      "type": "string",
      "description": "Salesforce LastModifiedDate, passed through. Often `…+0000` (no colon in the offset) — not strict RFC 3339, so no `format: date-time`."
    },
    "_links": {
      "type": "object",
      "required": [
        "self",
        "case",
        "cases"
      ],
      "properties": {
        "self": {
          "type": "object",
          "required": [
            "href"
          ],
          "properties": {
            "href": {
              "type": "string"
            },
            "templated": {
              "type": "boolean",
              "description": "True when `href` is an RFC 6570 URI template."
            }
          }
        },
        "case": {
          "type": "object",
          "required": [
            "href"
          ],
          "properties": {
            "href": {
              "type": "string"
            },
            "templated": {
              "type": "boolean",
              "description": "True when `href` is an RFC 6570 URI template."
            }
          }
        },
        "cases": {
          "type": "object",
          "required": [
            "href",
            "templated"
          ],
          "properties": {
            "href": {
              "type": "string"
            },
            "templated": {
              "type": "boolean",
              "const": true
            }
          }
        }
      }
    }
  }
}
READ support_list_cases Lists the member's customer-visible support cases, newest first, five per page, up to 25 cases.

Read-only — returns data and changes nothing.

Lists the member's customer-visible support cases, newest first, five per page, up to 25 cases. Booking, case type, and filed-since filters combine. Use it when the member has no case number. For a known case number, call support_get_case or support_get_case_status. Each case has a case number, type, subject, status, is_closed, and filed and updated times. total_count and has_more cover only the 25-case window.

Arguments

NameDescription
booking_reference
string

Booking number or contract number, with or without the G- prefix, for example G-123456. Also matches flight and car booking numbers. Returns only cases for that booking.

  • minLength: 1
type
string

Case type. Must match one listed value exactly. BPG is Best Price Guaranteed: a member's request for a refund or price match under the BPG program. Engine X covers cases about Engine's charge card.

  • Available values: "Account Inquiry", "BPG", "Billing Inquiry", "Car Rental Billing Inquiry", "Car Rental Changes", "Car Rental Other", "Car Rental Technology", "Car Rentals Client Reported Issues", "Client Inquiry", "Client Reported Issue", "Client Requests", "Engine X", "Flight Billing Inquiry", "Flight Changes", "Flight Inquiry", "Flight Loyalty/Benefits", "Flight Other", "Flight Technology", "Loyalty/Benefits", "Other", "Reservation Changes", "Reservation Inquiry", "System", "Technology"
since
string

Returns cases filed on or after this time. Accepts YYYY-MM-DD, read as UTC midnight, or an ISO 8601 datetime with Z or a numeric offset. The MCP rejects datetimes with no offset.

  • Example: "2026-01-01"
page
integer

Page of five cases, 1 to 5. Defaults to 1. A page past the last case returns an empty list.

  • Default: 1
  • minimum: 1
  • maximum: 5
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "booking_reference": "string",
      "type": "Account Inquiry",
      "since": "2026-01-01",
      "page": 1
    },
    "name": "support_list_cases"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "booking_reference": {
      "type": "string",
      "minLength": 1,
      "description": "Booking number or contract number, with or without the G- prefix, for example G-123456. Also matches flight and car booking numbers. Returns only cases for that booking."
    },
    "type": {
      "type": "string",
      "description": "Case type. Must match one listed value exactly. BPG is Best Price Guaranteed: a member's request for a refund or price match under the BPG program. Engine X covers cases about Engine's charge card.",
      "enum": [
        "Account Inquiry",
        "BPG",
        "Billing Inquiry",
        "Car Rental Billing Inquiry",
        "Car Rental Changes",
        "Car Rental Other",
        "Car Rental Technology",
        "Car Rentals Client Reported Issues",
        "Client Inquiry",
        "Client Reported Issue",
        "Client Requests",
        "Engine X",
        "Flight Billing Inquiry",
        "Flight Changes",
        "Flight Inquiry",
        "Flight Loyalty/Benefits",
        "Flight Other",
        "Flight Technology",
        "Loyalty/Benefits",
        "Other",
        "Reservation Changes",
        "Reservation Inquiry",
        "System",
        "Technology"
      ]
    },
    "since": {
      "type": "string",
      "description": "Returns cases filed on or after this time. Accepts YYYY-MM-DD, read as UTC midnight, or an ISO 8601 datetime with Z or a numeric offset. The MCP rejects datetimes with no offset.",
      "examples": [
        "2026-01-01",
        "2026-01-01T00:00:00Z"
      ]
    },
    "page": {
      "type": "integer",
      "minimum": 1,
      "maximum": 5,
      "default": 1,
      "description": "Page of five cases, 1 to 5. Defaults to 1. A page past the last case returns an empty list."
    }
  },
  "additionalProperties": false
}

Returns

{
  "cases": [
    {
      "case_number": "00001234",
      "type": "Billing Inquiry",
      "subject": "string",
      "status": "string",
      "is_closed": true,
      "filed_at": "string",
      "last_updated_at": "string"
    }
  ],
  "page": 1,
  "page_size": 5,
  "total_count": 0,
  "has_more": true,
  "_links": {
    "self": {
      "href": "string",
      "templated": true
    }
  }
}
{
cases*object[]
[{…}][
{
case_number*string
  • Example: "00001234"
type*string | null
  • Example: "Billing Inquiry"
subject*string | null
status*string

Verbatim from Salesforce Case.Status.

is_closed*boolean
filed_at*string

Salesforce CreatedDate, passed through. Often …+0000 (no colon in the offset) — not strict RFC 3339, so no format: date-time.

last_updated_at*string

Salesforce LastModifiedDate, passed through. Same …+0000 wire form as filed_at.

}
]
page*integer
  • Example: 1
page_size*integer
total_count*integer

Count of cases in the capped result window after the allowlist pair-check (at most 25), not a guaranteed full allowlist total. The service over-fetches then truncates; when the over-fetch under-fills after filtering, this count can be lower than the true matching set.

has_more*boolean

True when page * page_size < total_count for this same capped window — not evidence that more matching cases exist beyond the over-fetch.

_links*object
{…}
{
self*object
{…}
{
href*string
templatedboolean

True when href is an RFC 6570 URI template.

}
}
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "cases",
    "page",
    "page_size",
    "total_count",
    "has_more",
    "_links"
  ],
  "properties": {
    "cases": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "case_number",
          "type",
          "subject",
          "status",
          "is_closed",
          "filed_at",
          "last_updated_at"
        ],
        "properties": {
          "case_number": {
            "type": "string",
            "example": "00001234"
          },
          "type": {
            "type": [
              "string",
              "null"
            ],
            "example": "Billing Inquiry"
          },
          "subject": {
            "type": [
              "string",
              "null"
            ]
          },
          "status": {
            "type": "string",
            "description": "Verbatim from Salesforce Case.Status."
          },
          "is_closed": {
            "type": "boolean"
          },
          "filed_at": {
            "type": "string",
            "description": "Salesforce CreatedDate, passed through. Often `…+0000` (no colon in the offset) — not strict RFC 3339, so no `format: date-time`."
          },
          "last_updated_at": {
            "type": "string",
            "description": "Salesforce LastModifiedDate, passed through. Same `…+0000` wire form as `filed_at`."
          }
        }
      }
    },
    "page": {
      "type": "integer",
      "example": 1
    },
    "page_size": {
      "type": "integer",
      "const": 5
    },
    "total_count": {
      "type": "integer",
      "description": "Count of cases in the capped result window after the allowlist pair-check (at most 25), not a guaranteed full allowlist total. The service over-fetches then truncates; when the over-fetch under-fills after filtering, this count can be lower than the true matching set."
    },
    "has_more": {
      "type": "boolean",
      "description": "True when `page * page_size < total_count` for this same capped window — not evidence that more matching cases exist beyond the over-fetch."
    },
    "_links": {
      "type": "object",
      "required": [
        "self"
      ],
      "properties": {
        "self": {
          "type": "object",
          "required": [
            "href"
          ],
          "properties": {
            "href": {
              "type": "string"
            },
            "templated": {
              "type": "boolean",
              "description": "True when `href` is an RFC 6570 URI template."
            }
          }
        }
      }
    }
  }
}
READ support_search_help_center Searches Engine's public Help Center for how-to and policy answers, such as cancellation, Flex, billing, loyalty, booking rules, and product use.

Read-only — returns data and changes nothing.

Searches Engine's public Help Center for how-to and policy answers, such as cancellation, Flex, billing, loyalty, booking rules, and product use. Returns article excerpts with title, source URL, and relevance score, highest first. It returns public articles only. It cannot look up a member's bookings, cases, or account; the booking and case tools cover those. Call it even when unsure. An empty result means no article matched.

Arguments

NameDescription
question* required
string

A how-to or policy question in plain language, up to 2,000 characters. Leave out personal details such as email, phone, card numbers, full names, and booking details. They don't match articles. The MCP trims whitespace and rejects a blank question.

  • minLength: 1
  • maxLength: 2000
  • Example: "how do I cancel a hotel reservation"
max_results
integer

Most passages to return, 1 to 50. Defaults to 10.

  • Default: 10
  • minimum: 1
  • maximum: 50
{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "question": "how do I cancel a hotel reservation",
      "max_results": 10
    },
    "name": "support_search_help_center"
  }
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "question": {
      "type": "string",
      "minLength": 1,
      "maxLength": 2000,
      "description": "A how-to or policy question in plain language, up to 2,000 characters. Leave out personal details such as email, phone, card numbers, full names, and booking details. They don't match articles. The MCP trims whitespace and rejects a blank question.",
      "examples": [
        "how do I cancel a hotel reservation"
      ]
    },
    "max_results": {
      "type": "integer",
      "minimum": 1,
      "maximum": 50,
      "default": 10,
      "description": "Most passages to return, 1 to 50. Defaults to 10."
    }
  },
  "required": [
    "question"
  ],
  "additionalProperties": false
}

Returns

{
  "_links": {
    "self": {
      "href": "string",
      "templated": true
    }
  },
  "passages": [
    {
      "article_id": "000001919",
      "article_title": "Canceling a Reservation",
      "chunk_text": "string",
      "relevance_score": 0,
      "source_url": "https://example.com"
    }
  ]
}
{
_links*object
{…}
{
self*object
{…}
{
href*string
templatedboolean

True when href is an RFC 6570 URI template.

}
}
passages*object[]

Ranked highest-relevance first, at most max_results long. Empty means nothing matched, not that retrieval failed.

[{…}][
{
article_id*string

Salesforce article number.

  • Example: "000001919"
article_title*string
  • Example: "Canceling a Reservation"
chunk_text*string

The retrieved chunk — the text an answer may cite.

relevance_score*number($double)

Similarity to the question; higher is closer. Finite and unclamped — Data Cloud may report values outside [0, 1] when the index uses a different metric than the one we measured, and rewriting them would hide that drift.

source_url*string($uri)

Public Help Center URL for the article.

}
]
}
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "_links",
    "passages"
  ],
  "properties": {
    "_links": {
      "type": "object",
      "required": [
        "self"
      ],
      "properties": {
        "self": {
          "type": "object",
          "required": [
            "href"
          ],
          "properties": {
            "href": {
              "type": "string"
            },
            "templated": {
              "type": "boolean",
              "description": "True when `href` is an RFC 6570 URI template."
            }
          }
        }
      }
    },
    "passages": {
      "type": "array",
      "description": "Ranked highest-relevance first, at most `max_results` long. Empty means nothing matched, not that retrieval failed.",
      "items": {
        "type": "object",
        "required": [
          "article_id",
          "article_title",
          "chunk_text",
          "relevance_score",
          "source_url"
        ],
        "properties": {
          "article_id": {
            "type": "string",
            "description": "Salesforce article number.",
            "examples": [
              "000001919"
            ]
          },
          "article_title": {
            "type": "string",
            "examples": [
              "Canceling a Reservation"
            ]
          },
          "chunk_text": {
            "type": "string",
            "description": "The retrieved chunk — the text an answer may cite."
          },
          "relevance_score": {
            "type": "number",
            "description": "Similarity to the question; higher is closer. Finite and unclamped — Data Cloud may report values outside `[0, 1]` when the index uses a different metric than the one we measured, and rewriting them would hide that drift.",
            "format": "double"
          },
          "source_url": {
            "type": "string",
            "description": "Public Help Center URL for the article.",
            "format": "uri"
          }
        }
      }
    }
  }
}