Authentication
The API uses Bearer JWT tokens. Search and browse tools require no authentication. Booking and management tools require a valid token.
Getting a Token
Use guest_login (email only, instant) or login (email + password) to obtain a JWT token.
Using the Token
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9...
Tool Classification
| Public (no auth) | Authenticated (Bearer token) |
|---|
search_location, hotel_search, get_search_results, get_hotel_rooms, get_hotel_details, check_cancellation_policy, login, guest_login | prepare_booking, confirm_booking, create_checkout, get_payment_url, list_bookings, get_booking_details, cancel_booking |
Base URL & Transports
All endpoints are served from https://locktrip.com/mcp/. Three transport modes are supported:
| Transport | Method | Endpoint |
|---|
| REST | POST | https://locktrip.com/mcp/tools/{tool_name} |
| JSON-RPC 2.0 | POST | https://locktrip.com/mcp/rpc |
| SSE | GET | https://locktrip.com/mcp/sse |
Discovery Endpoints
| URL | Description |
|---|
| GET /mcp/openapi.json | OpenAPI 3.1 specification |
| GET /mcp/tools | List all tools with schemas |
| GET /mcp/discovery | MCP discovery document |
Content-Type: application/json for all POST requests.
Error Handling
REST Errors
| Status | Meaning |
|---|
| 200 | Success |
| 400 | Validation error (bad input) |
| 401 | Missing or invalid Bearer token |
| 404 | Unknown tool name |
| 429 | Rate limit exceeded |
JSON-RPC Errors
{
"jsonrpc": "2.0",
"id": 1,
"error": {
"code": -32001,
"message": "Authentication required for this tool.",
"data": {
"loginUrl": "https://users.locktrip.com/api/auth/login",
"signupTool": "guest_login"
}
}
}| Code | Meaning |
|---|
| -32600 | Invalid JSON-RPC request |
| -32601 | Unknown tool / method not found |
| -32001 | Authentication required or invalid token |
| -32007 | Rate limit exceeded |
| -32603 | Internal server error |
Rate Limits
Sliding-window rate limits per IP (anonymous) or per user ID (authenticated). Exceeding limits returns HTTP 429 or JSON-RPC error code -32007.
| Tool | Anonymous | Authenticated |
|---|
| hotel_search | 5 / minute | 20 / minute |
| All other tools | 30 / minute | 120 / minute |
Tool Reference
15 tools listed in recommended workflow order.
search_location
PublicSearch for locations (cities, regions, hotels) to get their IDs for hotel search. Returns matching locations with type and full name.
Request
| Field | Type | Req | Description |
|---|
| query | string | Yes | Search query (city name, region, or hotel name) |
| language | string | No | Language code (default: "en") |
Response
| Field | Type | Description |
|---|
| locations | Location[] | | Array of matching locations |
| locations[].id | string | | Location ID (use as regionId in hotel_search) |
| locations[].name | string | | Location name |
| locations[].type | string | | Location type (e.g., "CITY") |
| locations[].fullName | string | | Full location name with country |
| locations[].country | string | | Country name |
| totalCount | number | | Total number of matches returned |
Example
curl -X POST https://locktrip.com/mcp/tools/search_location \
-H "Content-Type: application/json" \
-d '{"query": "Paris"}'
# Response (200 OK):
{
"locations": [
{
"id": "5f078e431fd614748f9037f9",
"name": "Paris, France",
"country": "",
"type": "CITY",
"fullName": "Paris, France"
},
{
"id": "5f080b92b8f3040a9045c3e8",
"name": "Disneyland Paris, Boulevard de Parc, Coupvray, France",
"country": "",
"type": "CITY",
"fullName": "Disneyland Paris, Boulevard de Parc, Coupvray, France"
}
],
"totalCount": 10
}hotel_search
PublicInitiate a hotel search. Provide either regionId from search_location or latitude/longitude coordinates. Returns a searchKey to poll with get_search_results. Search runs asynchronously.
Request
| Field | Type | Req | Description |
|---|
| regionId | string | No | Location ID from search_location. Required unless lat/lng provided. |
| startDate | string | Yes | Check-in date (YYYY-MM-DD) |
| endDate | string | Yes | Check-out date (YYYY-MM-DD) |
| currency | string | No | Currency code (default: "USD") |
| rooms | Room[] | Yes | Room configurations |
| rooms[].adults | number | Yes | Number of adults (1-4) |
| rooms[].childrenAges | number[] | No | Ages of children (0-17) |
| nationality | string | Yes | 2-letter country code (e.g., US, GB) |
| latitude | number | No | Latitude (-90 to 90). Use with longitude instead of regionId. |
| longitude | number | No | Longitude (-180 to 180). Use with latitude instead of regionId. |
| radiusInMeters | number | No | Search radius in meters (default: 30000, max: 100000). Only with lat/lng. |
Response
| Field | Type | Description |
|---|
| searchKey | string | | Key to poll results with get_search_results |
| sessionId | string | | Internal session identifier |
| status | string | | Search status (e.g., "IN_PROGRESS") |
Example
curl -X POST https://locktrip.com/mcp/tools/hotel_search \
-H "Content-Type: application/json" \
-d '{
"regionId": "5f078e431fd614748f9037f9",
"startDate": "2026-04-15",
"endDate": "2026-04-17",
"currency": "EUR",
"rooms": [{"adults": 2}],
"nationality": "US"
}'
# Response (200 OK):
{
"searchKey": "47de06e3262ea3822bdc384a04470783",
"sessionId": "/280/137970/D20260228T093158/4fcf789dd1294b4194cdb2c263bdf264",
"status": "IN_PROGRESS"
}get_search_results
PublicGet paginated hotel search results. Poll until searchStatus is "COMPLETED". Supports filtering by price, stars, amenities, and meal types. Sorting by price, rating, or distance.
Pricing Intelligence
Each hotel result includes discountScore — LockTrip's proprietary machine learning score that calculates how much cheaper the offer is compared to other travel websites. The V8 ML model analyzes real-time pricing data from multiple hotel suppliers to predict savings. Use minPrice (LockTrip's price) and originalPrice (last best price on competing sites) together with discountScore to surface the best deals to users.
Request
| Field | Type | Req | Description |
|---|
| searchKey | string | Yes | Search key from hotel_search |
| page | number | No | Page number, 0-indexed (default: 0) |
| size | number | No | Results per page (default: 100, max: 5000) |
| currency | string | No | Currency code from hotel_search |
| sortBy | string | No | PRICE_ASC, PRICE_DESC, RATING_DESC, or DISTANCE |
| filters | object | No | Optional filters (see below) |
| filters.minPrice | number | No | Minimum price |
| filters.maxPrice | number | No | Maximum price |
| filters.starRatings | number[] | No | Star ratings to include (1-5) |
| filters.amenities | string[] | No | Required amenities |
| filters.mealTypes | string[] | No | Required meal types |
| filters.hotelName | string | No | Hotel name search |
Response
| Field | Type | Description |
|---|
| hotels | Hotel[] | | Array of matching hotels |
| hotels[].hotelId | string | | Hotel ID (use in get_hotel_rooms, get_hotel_details) |
| hotels[].name | string | | Hotel name |
| hotels[].starRating | number | | Star rating (1-5) |
| hotels[].address | string | | Street address |
| hotels[].latitude | number | | Latitude coordinate |
| hotels[].longitude | number | | Longitude coordinate |
| hotels[].images | string[] | | Hotel image URLs |
| hotels[].amenities | string[] | | Available amenities |
| hotels[].minPrice | number | | LockTrip's price for this hotel (lowest available rate) |
| hotels[].originalPrice | number | | Last best price found on competing travel websites (e.g. Booking.com, Expedia). When equal to minPrice, no discount was detected. |
| hotels[].currency | string | | Price currency code |
| hotels[].discountScore | number | | LockTrip's proprietary machine learning score (0-10) indicating how much cheaper this offer is compared to other travel websites. Powered by a V8 ML model that analyzes real-time pricing data from multiple hotel suppliers. Higher scores = bigger savings vs competitors. A score of 0 means no significant discount was detected. |
| hotels[].quality | number | | Overall quality score (0-1) combining star rating, reviews, amenities, and other factors |
| hotels[].reviewScore | number | | Guest review score (0-10) |
| hotels[].reviewCount | number|null | | Number of guest reviews |
| hotels[].hasFreeCancellation | boolean | | Whether any room has free cancellation |
| hotels[].isRefundable | boolean | | Whether any room is refundable |
| hotels[].refundableUntil | string|null | | ISO date until which free cancellation is available |
| hotels[].payment | string | | Payment type (e.g., "Cash") |
| hotels[].distance | number | | Distance from search center (km) |
| hotels[].boardType | string|null | | Default board type |
| hotels[].availableMealTypes | string[] | | Available meal types |
| totalCount | number | | Total hotels matching search |
| page | number | | Current page number |
| pageSize | number | | Results per page |
| hasMore | boolean | | Whether more pages are available |
| searchStatus | string | | "IN_PROGRESS" or "COMPLETED" |
Example
curl -X POST https://locktrip.com/mcp/tools/get_search_results \
-H "Content-Type: application/json" \
-d '{
"searchKey": "47de06e3262ea3822bdc384a04470783",
"page": 0,
"size": 2
}'
# Response (200 OK):
{
"hotels": [
{
"hotelId": "4703420",
"name": "Premiere Classe Boissy Saint Leger",
"starRating": 1,
"address": "P.A De La Haie Griselle 4 Rue Pompadour, Boissy-Saint-Leger",
"latitude": 48.759967,
"longitude": 2.501443,
"images": [
"https://imagecontent.net/images/full/5a0d94a0-5f7e-4e4e-b457-5e0673a96a95.jpeg"
],
"amenities": ["Family rooms", "Free Wifi", "Parking", "Air conditioning"],
"minPrice": 71.51,
"originalPrice": 71.51,
"currency": "EUR",
"discountScore": 0,
"quality": 0.19,
"reviewScore": 2.5,
"reviewCount": null,
"hasFreeCancellation": false,
"isRefundable": false,
"refundableUntil": null,
"payment": "Cash",
"distance": 15.32,
"boardType": null,
"availableMealTypes": []
}
],
"totalCount": 2403,
"page": 1,
"pageSize": 2,
"hasMore": true,
"searchStatus": "COMPLETED"
}get_hotel_rooms
PublicGet available room packages for a specific hotel. Returns quoteIds needed for booking. Each package includes price, meal type, amenities, and cancellation info.
Request
| Field | Type | Req | Description |
|---|
| hotelId | string | Yes | Hotel ID from search results |
| searchKey | string | Yes | Search key from hotel_search |
| startDate | string | Yes | Check-in date (YYYY-MM-DD) |
| endDate | string | Yes | Check-out date (YYYY-MM-DD) |
| rooms | Room[] | Yes | Room occupancy (same as hotel_search) |
| nationality | string | Yes | 2-letter country code |
| regionId | string | Yes | Region ID from search_location |
| currency | string | No | Currency code (default: "USD") |
Response
| Field | Type | Description |
|---|
| hotelId | string | | Hotel ID |
| hotelName | string | | Hotel name |
| checkIn | string | | Check-in date (YYYY-MM-DD) |
| checkOut | string | | Check-out date (YYYY-MM-DD) |
| packages | Package[] | | Available room packages |
| packages[].quoteId | string | | Quote ID (use in prepare_booking) |
| packages[].packageId | string | | Package identifier |
| packages[].roomName | string | | Room type name (e.g., "Standard, 3 Beds") |
| packages[].roomDescription | string | | HTML description of room features |
| packages[].mealType | string | | "Room Only", "Breakfast Included", etc. |
| packages[].mealDescription | string | | Meal plan description |
| packages[].maxOccupancy | number | | Maximum guests per room |
| packages[].amenities | string[] | | Room amenities list |
| packages[].price | number | | Total price for all nights |
| packages[].currency | string | | Price currency |
| packages[].pricePerNight | number | | Price per night |
| packages[].totalNights | number | | Number of nights |
| packages[].isRefundable | boolean | | Whether room is refundable |
Example
curl -X POST https://locktrip.com/mcp/tools/get_hotel_rooms \
-H "Content-Type: application/json" \
-d '{
"hotelId": "4384127",
"searchKey": "47de06e3262ea3822bdc384a04470783",
"startDate": "2026-04-15",
"endDate": "2026-04-17",
"rooms": [{"adults": 2}],
"nationality": "US",
"regionId": "5f078e431fd614748f9037f9",
"currency": "EUR"
}'
# Response (200 OK):
{
"hotelId": "4384127",
"hotelName": "",
"checkIn": "2026-04-15",
"checkOut": "2026-04-17",
"packages": [
{
"quoteId": "3e242771-1c15-4356-9a3b-1cd4bfc6d9fc_4384127",
"packageId": "3e242771-1c15-4356-9a3b-1cd4bfc6d9fc_4384127",
"roomName": "Standard, 3 Beds",
"roomDescription": "<p><strong>1 Double Bed</strong></p>...",
"mealType": "Room Only",
"mealDescription": "Room Only",
"maxOccupancy": 2,
"amenities": ["Free WiFi", "Flat-panel TV", "Private bathroom", "..."],
"price": 71.34,
"currency": "EUR",
"pricePerNight": 35.67,
"totalNights": 2,
"isRefundable": false
},
{
"quoteId": "e3fca710-0a05-4b96-a472-a93c941a58fc_4384127",
"packageId": "e3fca710-0a05-4b96-a472-a93c941a58fc_4384127",
"roomName": "Standard, 3 Beds",
"mealType": "Room Only",
"price": 77.53,
"currency": "EUR",
"pricePerNight": 38.765,
"totalNights": 2,
"isRefundable": true
}
]
}get_hotel_details
PublicGet detailed hotel information including description, amenities, reviews, photos, and location. Use after search to get full hotel info before booking.
Request
| Field | Type | Req | Description |
|---|
| hotelId | number | Yes | Hotel ID (numeric, from search results) |
| language | string | No | Language code (default: "en") |
| includeImages | boolean | No | Fetch additional images (default: false) |
| imageLimit | number | No | Max additional images (default: 20, max: 100) |
Response
| Field | Type | Description |
|---|
| hotel | object | | Hotel details object |
| hotel.id | number | | Hotel ID |
| hotel.name | string | | Hotel name |
| hotel.country | string | | Country |
| hotel.city | string | | City |
| hotel.star | number | | Star rating (1-5) |
| hotel.address | string | | Street address |
| hotel.latitude | number | | Latitude |
| hotel.longitude | number | | Longitude |
| hotel.description | string | | HTML description with sections |
| hotel.phone | string|null | | Phone number |
| hotel.hotelPhotos | Photo[] | | Photo URLs (relative paths) |
| hotel.reviews | object | | Review summary with score, count, keywords |
| hotel.hotelAmenities | Category[] | | Amenities grouped by category |
| additionalImages | Photo[] | | Extra images (if includeImages=true) |
Example
curl -X POST https://locktrip.com/mcp/tools/get_hotel_details \
-H "Content-Type: application/json" \
-d '{"hotelId": 4384127}'
# Response (200 OK):
{
"hotel": {
"id": 4384127,
"name": "Premiere Classe Plaisir",
"country": "France",
"city": "Plaisir",
"star": 1,
"address": "Za De Sainte Apolline Rue Des Poiriers",
"latitude": 48.7987,
"longitude": 1.9545,
"description": "<h2>Hotel Details</h2><p>Property Location...</p>",
"phone": null,
"hotelPhotos": [
{"url": "/gmx/full/d174a039-ebf9-4e42-8b42-5e31a6950b0e.jpeg"}
],
"reviews": {
"scoreSummary": 0,
"reviewsCount": 0,
"keyWords": []
},
"hotelAmenities": [
{
"hotelId": 4384127,
"categoryName": "Hotel Facilities & Services",
"features": [
{"name": "Free Wifi"},
{"name": "Parking"},
{"name": "24 Hour Front Desk"}
]
}
]
}
}check_cancellation_policy
PublicGet detailed cancellation policy for room packages. Shows free cancellation deadline and penalty fees by date range.
Request
| Field | Type | Req | Description |
|---|
| searchKey | string | Yes | Search key from hotel_search |
| hotelId | string | Yes | Hotel ID |
| packageIds | string[] | Yes | Package IDs to check (from get_hotel_rooms) |
Response
| Field | Type | Description |
|---|
| hotelId | string | | Hotel ID |
| policies | Policy[] | | Cancellation policy per package |
| policies[].packageId | string | | Package identifier |
| policies[].isRefundable | boolean | | Whether package is refundable |
| policies[].freeCancellationUntil | string|null | | Last date for free cancellation (YYYY-MM-DD) |
| policies[].fees | Fee[] | | Cancellation penalty fees |
| policies[].fees[].fromDate | string | | Penalty period start (YYYY-MM-DD) |
| policies[].fees[].toDate | string|null | | Penalty period end |
| policies[].fees[].amount | number | | Penalty amount |
| policies[].fees[].currency | string | | Currency code |
| policies[].fees[].percentage | number|null | | Percentage of booking price |
| policies[].remarks | string[]|null | | Additional policy notes |
Example
curl -X POST https://locktrip.com/mcp/tools/check_cancellation_policy \
-H "Content-Type: application/json" \
-d '{
"searchKey": "47de06e3262ea3822bdc384a04470783",
"hotelId": "4384127",
"packageIds": ["e3fca710-0a05-4b96-a472-a93c941a58fc_4384127"]
}'
# Response (200 OK):
{
"hotelId": "4384127",
"policies": [
{
"packageId": "e3fca710-0a05-4b96-a472-a93c941a58fc_4384127",
"isRefundable": true,
"freeCancellationUntil": "2026-04-13",
"fees": [
{
"fromDate": "2026-04-13",
"toDate": "2026-04-15",
"amount": 77.53,
"currency": "EUR",
"percentage": 100,
"description": "Full penalty after free cancellation period"
}
],
"remarks": ["Room: Standard, 3 Beds", "Board: Room Only"]
}
]
}guest_login
PublicRegister or login as a guest with just an email address. Returns a Bearer token for authenticated tools. New users receive a verification email and can set a password later.
Request
| Field | Type | Req | Description |
|---|
| email | string | Yes | User email address |
Response
| Field | Type | Description |
|---|
| token | string | | JWT Bearer token for authenticated API calls |
| userId | number | | Numeric user ID |
| email | string | | User email address |
| isNewUser | boolean | | Whether a new account was created |
Example
curl -X POST https://locktrip.com/mcp/tools/guest_login \
-H "Content-Type: application/json" \
-d '{"email": "[email protected]"}'
# Response (200 OK):
{
"token": "eyJhbGciOiJIUzUxMiJ9...",
"userId": 413900,
"email": "[email protected]",
"isNewUser": true
}login
PublicLogin with email and password to obtain a Bearer token. For registered users with confirmed accounts.
Request
| Field | Type | Req | Description |
|---|
| email | string | Yes | User email address |
| password | string | Yes | User password |
Response
| Field | Type | Description |
|---|
| token | string | | JWT Bearer token for authenticated API calls |
| userId | number | | Numeric user ID |
| email | string | | User email address |
Example
curl -X POST https://locktrip.com/mcp/tools/login \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "yourpassword"
}'
# Response (200 OK):
{
"token": "eyJhbGciOiJIUzUxMiJ9...",
"userId": 12345,
"email": "[email protected]"
}prepare_booking
Auth RequiredCreate a booking with guest details. Returns a preparedBookingId for confirmation. The booking expires after approximately 15 minutes. Guest count per room must match the adults count from the search.
Request
| Field | Type | Req | Description |
|---|
| quoteId | string | Yes | Quote ID from get_hotel_rooms |
| searchKey | string | No | Search key (validates cancellation policy) |
| rooms | Room[] | Yes | Guest assignments per room |
| rooms[].roomIndex | number | Yes | Room index (0-based) |
| rooms[].guests | Guest[] | Yes | Adult guests in this room |
| rooms[].guests[].firstName | string | Yes | First name |
| rooms[].guests[].lastName | string | Yes | Last name |
| rooms[].guests[].title | string | No | "Mr", "Mrs", or "Ms" (default: "Mr") |
| rooms[].guests[].email | string | No | Email address |
| rooms[].guests[].phone | string | No | Phone number |
| rooms[].guests[].isLeadGuest | boolean | No | Whether this is the lead guest |
| rooms[].children | Child[] | No | Children in this room |
| rooms[].children[].firstName | string | Yes | First name |
| rooms[].children[].lastName | string | Yes | Last name |
| rooms[].children[].age | number | Yes | Child age (0-17) |
| contactPerson | object | Yes | Contact person details |
| contactPerson.firstName | string | Yes | First name |
| contactPerson.lastName | string | Yes | Last name |
| contactPerson.email | string | Yes | Email address |
| contactPerson.phone | string | Yes | Phone number (min 5 chars) |
| contactPerson.title | string | No | "Mr", "Mrs", or "Ms" |
| contactPerson.countryCode | string | No | 2-letter country code |
| specialRequests | string | No | Special requests for the hotel |
Response
| Field | Type | Description |
|---|
| preparedBookingId | string | | Booking ID for confirm_booking |
| bookingInternalId | string | | Internal booking identifier |
| price | number | | Total price |
| currency | string | | Price currency |
| payment | string | | Payment type (e.g., "Cash") |
| discount | object | | Discount details (amount, currency) |
| taxes | Tax[] | | Itemized taxes and fees |
| taxes[].feeTitle | string | | Fee description |
| taxes[].value | string | | Fee amount |
| taxes[].currency | string | | Fee currency |
| taxes[].isIncludedInPrice | boolean | | Whether included in the total price |
| essentialInformation | string[] | | Check-in instructions, mandatory fees, policies |
Example
curl -X POST https://locktrip.com/mcp/tools/prepare_booking \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{
"quoteId": "3e242771-1c15-4356-9a3b-1cd4bfc6d9fc_4384127",
"rooms": [{
"roomIndex": 0,
"guests": [
{"firstName": "John", "lastName": "Smith", "title": "Mr",
"email": "[email protected]", "phone": "+1234567890",
"isLeadGuest": true},
{"firstName": "Jane", "lastName": "Smith", "title": "Mrs"}
]
}],
"contactPerson": {
"firstName": "John",
"lastName": "Smith",
"email": "[email protected]",
"phone": "+1234567890"
}
}'
# Response (200 OK):
{
"preparedBookingId": "69a2b7540a93415a4b4dbf13",
"bookingInternalId": "69a2b7540a93415a4b4dbf13",
"price": 71.34,
"currency": "EUR",
"payment": "Cash",
"discount": {"amount": 0, "currency": "EUR"},
"taxes": [
{
"feeTitle": "Taxes and Fees",
"value": "1.59",
"currency": "EUR",
"isIncludedInPrice": true
},
{
"feeTitle": "Taxes and Fees",
"value": "4.50",
"currency": "EUR",
"isIncludedInPrice": false
}
],
"essentialInformation": [
"CheckIn instructions: ...",
"Mandatory fees: ...",
"Know before you go: ..."
]
}confirm_booking
Auth RequiredConfirm and pay for a prepared booking using B2B credit line. Returns booking confirmation with voucher URL. For consumer payments, use create_checkout or get_payment_url instead.
Request
| Field | Type | Req | Description |
|---|
| bookingInternalId | string | Yes | Booking ID from prepare_booking (preparedBookingId) |
| quoteId | string | Yes | Quote ID used in prepare_booking |
| paymentMethod | string | No | Payment method (default: "CREDIT_LINE" for B2B) |
Response
| Field | Type | Description |
|---|
| accepted | boolean | | Whether booking confirmation was accepted |
| message | string|null | | Confirmation status message |
| voucherUrl | string|null | | URL to booking voucher (if accepted) |
Example
curl -X POST https://locktrip.com/mcp/tools/confirm_booking \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{
"bookingInternalId": "69a2b7540a93415a4b4dbf13",
"quoteId": "3e242771-1c15-4356-9a3b-1cd4bfc6d9fc_4384127"
}'
# Response (200 OK):
{
"accepted": true,
"message": "Booking confirmed successfully",
"voucherUrl": "https://locktrip.com/booking/hotel/voucher/69a2b7540a93415a4b4dbf13"
}create_checkout
Auth RequiredCreate a Revolut payment checkout URL for a prepared booking. Returns a hosted checkout link the user can click to pay. After payment completes, the booking is automatically confirmed via webhook. Use this for B2C consumers.
Request
| Field | Type | Req | Description |
|---|
| bookingId | string | Yes | Booking ID from prepare_booking (preparedBookingId) |
| currency | string | Yes | 3-letter currency code (e.g., USD, EUR, GBP) |
| backUrl | string | No | Cancel/back redirect URL (defaults to locktrip.com) |
| successUrl | string | No | Success redirect URL |
Response
| Field | Type | Description |
|---|
| checkoutUrl | string | | Revolut hosted checkout URL for payment |
| checkoutToken | string | | Payment token for tracking |
| expiresInMinutes | number | | Token expiration time (20 minutes) |
| message | string | | User instruction message |
Example
curl -X POST https://locktrip.com/mcp/tools/create_checkout \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{
"bookingId": "69a2b7540a93415a4b4dbf13",
"currency": "EUR"
}'
# Response (200 OK):
{
"checkoutUrl": "https://checkout.revolut.com/pay/abc123...",
"checkoutToken": "rev_tok_abc123...",
"expiresInMinutes": 20,
"message": "Payment checkout link created. Share this URL with the user to complete payment."
}get_payment_url
Auth RequiredGet a Stripe checkout URL for paying a prepared booking. Returns a URL to redirect the customer to complete payment via credit card.
Request
| Field | Type | Req | Description |
|---|
| bookingId | string | Yes | Booking ID from prepare_booking (preparedBookingId) |
| currency | string | Yes | Payment currency code (e.g., USD, EUR) |
| backUrl | string | Yes | URL to redirect on cancel/back |
| successUrl | string | No | Custom URL to redirect on success |
Response
| Field | Type | Description |
|---|
| url | string | | Stripe checkout URL to redirect customer to |
| sessionId | string | | Stripe session ID for tracking |
Example
curl -X POST https://locktrip.com/mcp/tools/get_payment_url \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{
"bookingId": "69a2b7540a93415a4b4dbf13",
"currency": "EUR",
"backUrl": "https://example.com/cancel"
}'
# Response (200 OK):
{
"url": "https://checkout.stripe.com/c/pay/cs_live_abc123...",
"sessionId": "cs_live_abc123..."
}list_bookings
Auth RequiredList bookings for the authenticated user. Filter by status: UPCOMING, COMPLETED, CANCELLED, or PENDING.
Request
| Field | Type | Req | Description |
|---|
| type | string | No | "UPCOMING", "COMPLETED", "CANCELLED", or "PENDING" (default: "UPCOMING") |
| page | number | No | Page number (0-indexed) |
| size | number | No | Results per page |
Response
| Field | Type | Description |
|---|
| bookings | BookingSummary[] | | Array of booking summaries |
| bookings[].bookingId | string | | Booking identifier |
| bookings[].bookingReferenceId | string | | Provider reference ID |
| bookings[].hotelName | string | | Hotel name |
| bookings[].hotelCity | string | | City where hotel is located |
| bookings[].checkIn | string | | Check-in date (YYYY-MM-DD) |
| bookings[].checkOut | string | | Check-out date (YYYY-MM-DD) |
| bookings[].status | string | | Booking status (DONE, PENDING, CANCELLED) |
| bookings[].totalPrice | number | | Total booking price |
| bookings[].currency | string | | Currency code |
| bookings[].guestName | string | | Lead guest name |
| bookings[].roomCount | number | | Number of rooms |
| bookings[].createdAt | string | | Booking creation timestamp (ISO 8601) |
| bookings[].hotelPhoto | string|null | | Hotel image URL |
| totalCount | number | | Total number of bookings |
| page | number | | Current page number |
| pageSize | number | | Results per page |
Example
curl -X POST https://locktrip.com/mcp/tools/list_bookings \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{"type": "UPCOMING"}'
# Response (200 OK):
{
"bookings": [
{
"bookingId": "69a2b7540a93415a4b4dbf13",
"bookingReferenceId": "LT-2026-AB12CD",
"hotelName": "Premiere Classe Plaisir",
"hotelCity": "Plaisir",
"checkIn": "2026-04-15",
"checkOut": "2026-04-17",
"status": "DONE",
"totalPrice": 71.34,
"currency": "EUR",
"guestName": "John Smith",
"roomCount": 1,
"createdAt": "2026-02-28T09:35:00.000Z",
"hotelPhoto": "https://imagecontent.net/images/full/d174a039.jpeg"
}
],
"totalCount": 1,
"page": 0,
"pageSize": 10
}get_booking_details
Auth RequiredGet full details of a specific booking including hotel info, guests, rooms, payment status, and cancellation policy.
Request
| Field | Type | Req | Description |
|---|
| bookingId | string | Yes | Booking ID to retrieve |
Response
| Field | Type | Description |
|---|
| bookingId | string | | Booking identifier |
| bookingReferenceId | string | | Provider reference ID |
| providerReference | string | | Additional provider reference |
| status | string | | Booking status (DONE, PENDING, CANCELLED) |
| hotel | object | | Hotel details |
| hotel.id | string|number | | Hotel ID |
| hotel.name | string | | Hotel name |
| hotel.address | string | | Street address |
| hotel.city | string | | City |
| hotel.country | string | | Country |
| hotel.phone | string | | Contact phone |
| hotel.starRating | number | | Star rating (1-5) |
| hotel.imageUrl | string | | Hotel image URL |
| checkIn | string | | Check-in date (YYYY-MM-DD) |
| checkOut | string | | Check-out date (YYYY-MM-DD) |
| rooms | Room[] | | Booked rooms with guests |
| rooms[].roomName | string | | Room type name |
| rooms[].mealType | string | | Meal plan (BB, HB, FB, etc.) |
| rooms[].guests | Guest[] | | Guest names (firstName, lastName) |
| rooms[].price | number | | Room price |
| contactPerson | object | | Contact person (firstName, lastName, email, phone) |
| totalPrice | number | | Total booking price |
| currency | string | | Currency code |
| paymentStatus | string | | Payment status (PAID, PENDING) |
| cancellationPolicy | object|null | | Cancellation policy with fees and deadlines |
| specialRequests | string | | Guest special requests |
| createdAt | string | | Booking creation date |
| confirmedAt | string|null | | Confirmation date (null if pending) |
Example
curl -X POST https://locktrip.com/mcp/tools/get_booking_details \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{"bookingId": "69a2b7540a93415a4b4dbf13"}'
# Response (200 OK):
{
"bookingId": "69a2b7540a93415a4b4dbf13",
"bookingReferenceId": "LT-2026-AB12CD",
"status": "DONE",
"hotel": {
"id": 4384127,
"name": "Premiere Classe Plaisir",
"address": "Za De Sainte Apolline Rue Des Poiriers",
"city": "Plaisir",
"country": "France",
"starRating": 1,
"imageUrl": "https://imagecontent.net/images/full/d174a039.jpeg"
},
"checkIn": "2026-04-15",
"checkOut": "2026-04-17",
"rooms": [
{
"roomName": "Standard, 3 Beds",
"mealType": "Room Only",
"guests": [
{"firstName": "John", "lastName": "Smith"},
{"firstName": "Jane", "lastName": "Smith"}
],
"price": 71.34
}
],
"contactPerson": {
"firstName": "John",
"lastName": "Smith",
"email": "[email protected]",
"phone": "+1234567890"
},
"totalPrice": 71.34,
"currency": "EUR",
"paymentStatus": "PAID",
"cancellationPolicy": {
"packageId": "3e242771-..._4384127",
"isRefundable": false,
"freeCancellationUntil": null,
"fees": []
},
"createdAt": "2026-02-28",
"confirmedAt": "2026-02-28"
}cancel_booking
Auth RequiredRequest booking cancellation. Call with confirmed=false first to preview cancellation fees, then with confirmed=true to execute. Returns refund amount and cancellation fee.
Request
| Field | Type | Req | Description |
|---|
| bookingId | string | Yes | Booking ID to cancel |
| confirmed | boolean | Yes | Set true to execute cancellation |
| reason | string | No | Reason for cancellation |
Response
| Field | Type | Description |
|---|
| success | boolean | | Whether cancellation was executed |
| message | string | | Status message (preview or confirmation) |
Example
# Step 1: Preview cancellation (dry run)
curl -X POST https://locktrip.com/mcp/tools/cancel_booking \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{
"bookingId": "69a2b7540a93415a4b4dbf13",
"confirmed": false
}'
# Response (200 OK):
{
"success": false,
"message": "Cancellation not confirmed. Set confirmed=true to proceed with cancellation."
}
# Step 2: Execute cancellation
curl -X POST https://locktrip.com/mcp/tools/cancel_booking \
-H "Content-Type: application/json" \
-H "Authorization: Bearer eyJhbGciOiJIUzUxMiJ9..." \
-d '{
"bookingId": "69a2b7540a93415a4b4dbf13",
"confirmed": true,
"reason": "Change of plans"
}'
# Response (200 OK):
{
"success": true,
"message": "Booking cancelled successfully"
}