Locktrip
← Zpět na AI agenty

API dokumentace

Kompletní reference pro LockTrip Hotel Booking MCP API. 15 nástrojů pro vyhledávání, rezervaci, platbu a správu.

Integrating a backend service? The same product is available as a native GraphQL API with credit line billing for B2B partners. See the GraphQL B2B docs →

Autentizace

API používá Bearer JWT tokeny. Nástroje pro vyhledávání a prohlížení nevyžadují autentizaci. Nástroje pro rezervaci a správu vyžadují platný token.

Získání tokenu

Použijte guest_login (pouze e-mail, okamžitě) nebo login (e-mail + heslo) pro získání JWT tokenu.

Použití tokenu

Authorization: Bearer eyJhbGciOiJIUzUxMiJ9...

OAuth 2.1 (klienti MCP)

Klienti MCP (například Claude, ChatGPT) se autentizují automaticky přes OAuth 2.1 s PKCE — nic nenastavujete. Při odpovědi 401 klient objeví server na https://locktrip.com/.well-known/oauth-authorization-server, dynamicky se zaregistruje (POST /register) a poté projde tokem authorization code: /authorize (souhlas uživatele, chráněno službou Cloudflare Turnstile) → /token. Rozsahy: "mcp" (plus "offline_access" pro refresh token). Pro přímou integraci přes REST/curl použijte místo toho ruční Bearer token (viz výše).

Per-call auth: sessionToken

Pro přímá REST nebo JSON-RPC volání přijímají autentizované nástroje také argument sessionToken jako alternativu k hlavičce Authorization. Token z guest_login (pouze e-mail — bez hesla, okamžitě) vytvoří relaci HOSTA a relace HOSTA funguje POUZE s prepare_booking a create_checkout. get_payment_url, list_bookings, get_booking_details, cancel_booking a confirm_booking vyžadují registrovaný účet — ten token získáte přes login (e-mail + heslo). B2B partner s úvěrovou linkou se musí autentizovat pomocí login, nikdy guest_login: relace hosta nemá úvěrovou linku, takže ji confirm_booking odmítne. Pokud volání vrátí AUTH_INSUFFICIENT_ROLE (HTTP 403), token je platný a chybná je jeho role — přejděte na login místo vyžádání dalšího tokenu guest_login.

Klasifikace nástrojů

Veřejný (bez autentizace)Autentizovaný (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

Základní URL a transporty

Všechny koncové body jsou obsluhovány z https://locktrip.com/mcp/. Jsou podporovány tři režimy transportu:

TransportMetodaKoncový bod
RESTPOSThttps://locktrip.com/mcp/tools/{tool_name}
MCP Streamable HTTPPOSThttps://locktrip.com/mcp/rpc
MCP Streamable HTTP (alias)POSThttps://locktrip.com/mcp/sse

Koncové body pro objevování

URLPopis
GET /mcp/openapi.jsonOpenAPI 3.1 specifikace
GET /mcp/toolsSeznam všech nástrojů se schématy
GET /mcp/discoveryMCP dokument pro objevování

Content-Type: application/json pro všechny POST požadavky.

Zpracování chyb

REST chyby

StavVýznam
200Úspěch
400Chyba validace (neplatný vstup)
401Chybějící nebo neplatný Bearer token
403Ověřeno, ale tato relace nemá požadovanou roli - použijte login, nikoli guest_login
404Neznámý nástroj
429Překročen limit požadavků

The error envelope — read recoverable, not the message

Every classified error carries the same envelope. mcpCode is the stable machine-readable class — branch on it, never on the message text. recoverable is behavioural guidance and the field an autonomous agent should act on: true means the caller can fix the request and retry (bad input, expired search session, rate limit); false means retrying the same call is futile — change something first. A recoverable: false with AUTH_INSUFFICIENT_ROLE specifically means your token is valid but its role is wrong: switch to login, and do NOT fetch another guest_login token.

// REST — the HTTP status carries the class, and the body repeats it
HTTP 403
{
  "error": {
    "code": -32009,
    "message": "This tool requires a registered account. ...",
    "data": { "mcpCode": "AUTH_INSUFFICIENT_ROLE", "recoverable": false, "details": { ... } }
  }
}

Transports differ, deliberately. On /mcp/tools/* (REST) a failure returns a real HTTP status — 400, 401, 403, 404, 409, 429, 500, 502. On /mcp/rpc and /mcp/sse a failure returns HTTP 200 with the error inside the JSON-RPC body, as the JSON-RPC spec requires. If you put a circuit breaker or retry policy on HTTP status alone, it will see the RPC transport as permanently healthy — branch on data.mcpCode and data.recoverable instead.

JSON-RPC chyby

{
  "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"
    }
  }
}
KódVýznam
-32700Poškozený JSON — tělo požadavku se nepodařilo zpracovat
-32600Neplatný JSON-RPC požadavek
-32601Neznámý nástroj / metoda nenalezena
-32001Vyžadována autentizace nebo neplatný token
-32009Ověřeno, ale tato relace nemá požadovanou roli - použijte login, nikoli guest_login
-32007Překročen limit požadavků
-32603Interní chyba serveru

Limity požadavků

Klouzavé limity požadavků podle IP (anonymní) nebo podle ID uživatele (autentizovaní). Překročení limitů vrací HTTP 429 nebo JSON-RPC kód chyby -32007.

NástrojAnonymníAutentizovaný
hotel_search5/ minuta20/ minuta
Všechny ostatní nástroje30/ minuta120/ minuta

Reference nástrojů

15 nástrojů seřazených v doporučeném pracovním pořadí.

search_location

Veřejný

Vyhledávání lokací (měst, regionů, hotelů) pro získání jejich identifikátorů pro vyhledávání hotelů. Vrací odpovídající lokace s typem a plným názvem.

Požadavek

PoleTypPov.Popis
querystringYesSearch query (city name, region, or hotel name)
languagestringNoLanguage code (default: "en")

Odpověď

PoleTypPopis
locationsLocation[]Array of matching locations
locations[].idstringLocation ID (use as regionId in hotel_search)
locations[].namestringLocation name
locations[].typestringLocation type (e.g., "CITY")
locations[].fullNamestringFull location name with country
locations[].countrystringCountry name
totalCountnumberTotal number of matches returned

Příklad

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
}

get_search_results

Veřejný

Získání stránkovaných výsledků vyhledávání. Dotazujte, dokud searchStatus nebude "COMPLETED". Podporuje filtrování podle ceny, hvězdiček, vybavení a typů stravování. Řazení podle ceny, hodnocení nebo vzdálenosti.

Cenová analytika

Každý výsledek hotelu obsahuje discountScore — proprietární skóre strojového učení LockTripu, které vypočítává, o kolik je nabídka levnější ve srovnání s ostatními cestovními weby. ML model V8 analyzuje cenová data v reálném čase od více hotelových dodavatelů pro predikci úspor. Použijte minPrice (cena LockTripu) a originalPrice (poslední nejlepší cena na konkurenčních webech) společně s discountScore pro zobrazení nejlepších nabídek uživatelům.

Požadavek

PoleTypPov.Popis
searchKeystringYesSearch key from hotel_search
pagenumberNoPage number, 0-indexed (default: 0)
sizenumberNoResults per page (default: 100, max: 5000)
currencystringNoCurrency code from hotel_search
sortBystringNoPRICE_ASC, PRICE_DESC, RATING_DESC, or DISTANCE
filtersobjectNoOptional filters (see below)
filters.minPricenumberNoMinimum price
filters.maxPricenumberNoMaximum price
filters.starRatingsnumber[]NoStar ratings to include (1-5)
filters.amenitiesstring[]NoRequired amenities
filters.mealTypesstring[]NoRequired meal types
filters.hotelNamestringNoHotel name search

Odpověď

PoleTypPopis
hotelsHotel[]Array of matching hotels
hotels[].hotelIdstringHotel ID (use in get_hotel_rooms, get_hotel_details)
hotels[].namestringHotel name
hotels[].starRatingnumberStar rating (1-5)
hotels[].addressstringStreet address
hotels[].latitudenumberLatitude coordinate
hotels[].longitudenumberLongitude coordinate
hotels[].imagesstring[]Hotel image URLs
hotels[].amenitiesstring[]Available amenities
hotels[].minPricenumberLockTrip's price for this hotel (lowest available rate)
hotels[].originalPricenumberLast best price found on competing travel websites (e.g. Booking.com, Expedia). When equal to minPrice, no discount was detected.
hotels[].currencystringPrice currency code
hotels[].discountScorenumberLockTrip's proprietary machine learning score 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 = bigger savings. 0 means no significant discount was detected. RELATIVE, WITH NO FIXED UPPER BOUND — the model output is not clamped. Across millions of live results we observed a range of roughly 0 to 60, with about one result in ten above 10. Rank and compare results against each other; do NOT normalise against a constant maximum.
hotels[].qualitynumberInternal ranking scalar (the default sort key) derived from discountScore, distance and review score. RELATIVE, WITH NO FIXED UPPER BOUND and no absolute meaning — over the same data we observed roughly 0 to 23, with under a third above 1. 0 means the hotel has no discount score or no qualifying reviews. Use it to order results; do not display it as a rating or normalise it against a constant.
hotels[].reviewScorenumberGuest review score (0-10). This is the one to show a user.
hotels[].reviewCountnumber|nullNumber of guest reviews
hotels[].hasFreeCancellationbooleanWhether any room has free cancellation
hotels[].isRefundablebooleanWhether any room is refundable
hotels[].refundableUntilstring|nullISO date until which free cancellation is available
hotels[].paymentstringPayment type (e.g., "Cash")
hotels[].distancenumberDistance from search center (km)
hotels[].boardTypestring|nullDefault board type
hotels[].availableMealTypesstring[]Available meal types
totalCountnumberTotal hotels matching search
pagenumberCurrent page number, 0-indexed — the SAME indexing as the request. Request page 0 and this echoes 0. To walk pages, request page + 1.
pageSizenumberResults per page
hasMorebooleanWhether more pages are available
searchStatusstring"IN_PROGRESS" or "COMPLETED"

Příklad

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://static.locktrip.com/hotel-photos/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": 0,
  "pageSize": 2,
  "hasMore": true,
  "searchStatus": "COMPLETED"
}

get_hotel_rooms

Veřejný

Získání dostupných pokojových balíčků pro konkrétní hotel. Vrací hodnoty quoteId potřebné pro rezervaci. Každý balíček obsahuje cenu, typ stravování, vybavení a informace o stornování.

Požadavek

PoleTypPov.Popis
hotelIdstringYesHotel ID from search results
searchKeystringYesSearch key from hotel_search
startDatestringYesCheck-in date (YYYY-MM-DD). MUST be in the future — a past date is rejected with "Check-in date cannot be in the past". The dates in the examples are illustrative; substitute your own future window.
endDatestringYesCheck-out date (YYYY-MM-DD)
roomsRoom[]YesRoom occupancy (same as hotel_search)
nationalitystringYes2-letter country code
regionIdstringYesRegion ID from search_location
currencystringNoCurrency code (default: "USD")

Odpověď

PoleTypPopis
hotelIdstringHotel ID
hotelNamestringHotel name
checkInstringCheck-in date (YYYY-MM-DD)
checkOutstringCheck-out date (YYYY-MM-DD)
packagesPackage[]Available room packages
packages[].quoteIdstringQuote ID (use in prepare_booking)
packages[].packageIdstringPackage identifier
packages[].roomNamestringRoom type name (e.g., "Standard, 3 Beds")
packages[].roomDescriptionstringHTML description of room features
packages[].mealTypestring"Room Only", "Breakfast Included", etc.
packages[].mealDescriptionstringMeal plan description
packages[].maxOccupancynumberMaximum guests per room
packages[].amenitiesstring[]Room amenities list
packages[].pricenumberTotal price for all nights
packages[].currencystringPrice currency
packages[].pricePerNightnumberPrice per night
packages[].totalNightsnumberNumber of nights
packages[].isRefundablebooleanWhether room is refundable

Příklad

curl -X POST https://locktrip.com/mcp/tools/get_hotel_rooms \
  -H "Content-Type: application/json" \
  -d '{"hotelId":"4384127","searchKey":"47de06e3262ea3822bdc384a04470783","startDate":"2027-04-15","endDate":"2027-04-17","rooms":[{"adults":2}],"nationality":"US","regionId":"5f078e431fd614748f9037f9","currency":"EUR"}'

# Response (200 OK):
{
  "hotelId": "4384127",
  "hotelName": "",
  "checkIn": "2027-04-15",
  "checkOut": "2027-04-17",
  "packages": [
    {
      "quoteId": "3e242771-1c15-4356-9a3b-1cd4bfc6d9fc_4384127",
      "packageId": "3e242771-1c15-4356-9a3b-1cd4bfc6d9fc_4384127",
      "roomName": "Standard, 3 Beds",
      "mealType": "Room Only",
      "price": 71.34,
      "currency": "EUR",
      "pricePerNight": 35.67,
      "totalNights": 2,
      "isRefundable": false
    }
  ]
}

get_hotel_details

Veřejný

Získání podrobných informací o hotelu včetně popisu, vybavení, recenzí, fotografií a polohy. Použijte po vyhledávání pro kompletní informace o hotelu před rezervací.

Požadavek

PoleTypPov.Popis
hotelIdnumberYesHotel ID (numeric, from search results)
languagestringNoLanguage code (default: "en")
includeImagesbooleanNoFetch additional images (default: false)
imageLimitnumberNoMax additional images (default: 20, max: 100)

Odpověď

PoleTypPopis
hotelobjectHotel details object
hotel.idnumberHotel ID
hotel.namestringHotel name
hotel.countrystringCountry
hotel.citystringCity
hotel.starnumberStar rating (1-5)
hotel.addressstringStreet address
hotel.latitudenumberLatitude
hotel.longitudenumberLongitude
hotel.descriptionstringHTML description with sections
hotel.phonestring|nullPhone number
hotel.hotelPhotosPhoto[]Photo URLs (relative paths)
hotel.reviewsobjectReview summary with score, count, keywords
hotel.hotelAmenitiesCategory[]Amenities grouped by category
additionalImagesPhoto[]Extra images (if includeImages=true)

Příklad

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",
    "description": "<h2>Hotel Details</h2><p>Property Location...</p>",
    "hotelPhotos": [{"url": "https://static.locktrip.com/hotel-photos/full/d174a039-ebf9-4e42-8b42-5e31a6950b0e.jpeg"}],
    "reviews": {"scoreSummary": 0, "reviewsCount": 0, "keyWords": []},
    "hotelAmenities": [{"categoryName": "Hotel Facilities & Services", "features": [{"name": "Free Wifi"}]}]
  }
}

check_cancellation_policy

Veřejný

Získání podrobných storno podmínek pro pokojové balíčky. Zobrazuje lhůtu pro bezplatné stornování a penále podle časových období.

Požadavek

PoleTypPov.Popis
searchKeystringYesSearch key from hotel_search
hotelIdstringYesHotel ID
packageIdsstring[]YesPackage UUIDs, WITHOUT the _hotelId suffix — take the quoteId from get_hotel_rooms and truncate it: quoteId.split('_')[0]. Passing the full quoteId here fails with a misleading SESSION_EXPIRED even on a live session, because the policy lookup matches the bare UUID.

Odpověď

PoleTypPopis
hotelIdstringHotel ID
policiesPolicy[]Cancellation policy per package
policies[].packageIdstringPackage identifier
policies[].isRefundablebooleanWhether package is refundable
policies[].freeCancellationUntilstring|nullExact instant free cancellation ends, ISO 8601 UTC (e.g. 2027-04-12T22:00:00.000Z); cancel before it. Same format in get_booking_details.
policies[].feesFee[]Cancellation penalty fees
policies[].fees[].fromDatestringPenalty period start (YYYY-MM-DD)
policies[].fees[].toDatestring|nullPenalty period end
policies[].fees[].amountnumberPenalty amount
policies[].fees[].currencystring|absentThe supplier's own currency for this penalty. OMITTED, never guessed, when the supplier states none — treat an absent currency as unpriced rather than assuming your search currency. (Before 2026-08 this field was hardcoded to USD and was wrong for every non-USD search.)
policies[].fees[].percentagenumber|nullPercentage of booking price
policies[].remarksstring[]|nullAdditional policy notes

Příklad

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"]}'

# NOTE the packageId has NO _4384127 suffix. Passing the full quoteId here returns
# 409 SESSION_EXPIRED even on a live session.

# Response (200 OK):
{
  "hotelId": "4384127",
  "policies": [{
    "packageId": "e3fca710-0a05-4b96-a472-a93c941a58fc_4384127",
    "isRefundable": true,
    "freeCancellationUntil": "2027-04-12T22:00:00.000Z",
    "fees": [{"fromDate":"2027-04-12","toDate":"2027-04-15","amount":77.53,"currency":"EUR","percentage":100}],
    "remarks": ["Room: Standard, 3 Beds", "Board: Room Only"]
  }]
}

guest_login

Veřejný

Registrace nebo přihlášení jako host pouze s e-mailovou adresou. Vrací Bearer token pro autentizované nástroje. KAŽDÉ volání odešle ověřovací e-mail na tuto adresu, i pro již existující účet — získejte token jednou a znovu jej použijte. Výsledkem je relace HOSTA.

Požadavek

PoleTypPov.Popis
emailstringYesUser email address

Odpověď

PoleTypPopis
tokenstringJWT Bearer token for authenticated API calls
userIdnumberNumeric user ID
emailstringUser email address
isNewUserbooleanWhether a new account was created

Příklad

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

Veřejný

Přihlášení pomocí e-mailu a hesla pro získání Bearer tokenu. Pro registrované uživatele s potvrzenými účty.

Požadavek

PoleTypPov.Popis
emailstringYesUser email address
passwordstringYesUser password

Odpověď

PoleTypPopis
tokenstringJWT Bearer token for authenticated API calls
userIdnumberNumeric user ID
emailstringUser email address

Příklad

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

Vyžaduje autentizaci

Vytvoření rezervace s údaji o hostovi. Vrací preparedBookingId pro potvrzení. Připravená rezervace nemá pevnou dobu platnosti; vyprší vyhledávací relace spojená s jejím quoteId. Počet hostů na pokoj musí odpovídat počtu dospělých z vyhledávání.

Požadavek

PoleTypPov.Popis
quoteIdstringYesQuote ID from get_hotel_rooms
searchKeystringYesSearch key from hotel_search — the SAME one used for get_hotel_rooms. REQUIRED: omitting it returns 400 VALIDATION_ERROR naming searchKey as the failing path. It warms the cancellation-policy cache the backend needs in order to book.
roomsRoom[]YesGuest assignments per room
rooms[].roomIndexnumberYesRoom index (0-based)
rooms[].guestsGuest[]YesAdult guests in this room
rooms[].guests[].firstNamestringYesFirst name
rooms[].guests[].lastNamestringYesLast name
rooms[].guests[].titlestringNo"Mr", "Mrs", or "Ms" (default: "Mr")
rooms[].guests[].emailstringNoEmail address
rooms[].guests[].phonestringNoPhone number
rooms[].guests[].isLeadGuestbooleanNoWhether this is the lead guest
rooms[].childrenChild[]NoChildren in this room
rooms[].children[].firstNamestringYesFirst name
rooms[].children[].lastNamestringYesLast name
rooms[].children[].agenumberYesChild age (0-17)
contactPersonobjectYesContact person details
contactPerson.firstNamestringYesFirst name
contactPerson.lastNamestringYesLast name
contactPerson.emailstringYesEmail address
contactPerson.phonestringYesPhone number (min 5 chars)
contactPerson.titlestringNo"Mr", "Mrs", or "Ms"
contactPerson.countryCodestringNo2-letter country code
specialRequestsstringNoSpecial requests for the hotel

Odpověď

PoleTypPopis
preparedBookingIdstringBooking ID for confirm_booking
bookingInternalIdstringInternal booking identifier
pricenumberTotal price
currencystringPrice currency
paymentstringPayment type (e.g., "Cash")
discountobjectDiscount details (amount, currency)
taxesTax[]Itemized taxes and fees
essentialInformationstring[]Check-in instructions, mandatory fees, policies

Příklad

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","searchKey":"47de06e3262ea3822bdc384a04470783","rooms":[{"roomIndex":0,"guests":[{"firstName":"John","lastName":"Smith","title":"Mr","email":"[email protected]","phone":"+1234567890","isLeadGuest":true}]}],"contactPerson":{"firstName":"John","lastName":"Smith","email":"[email protected]","phone":"+1234567890"}}'

# Response (200 OK):
{"preparedBookingId":"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}],"essentialInformation":["CheckIn instructions: ..."]}

confirm_booking

Vyžaduje autentizaci

Potvrzení a platba připravené rezervace přes B2B kreditní linku. Vrací potvrzení rezervace s URL voucheru. Pro spotřebitelské platby použijte create_checkout nebo get_payment_url.

Požadavek

PoleTypPov.Popis
bookingInternalIdstringYesBooking ID from prepare_booking (preparedBookingId)
quoteIdstringYesQuote ID used in prepare_booking
paymentMethodstringNoPayment method (default: "CREDIT_LINE" for B2B)

Odpověď

PoleTypPopis
acceptedbooleanWhether booking confirmation was accepted
messagestring|nullConfirmation status message
voucherUrlstring|nullURL to booking voucher (if accepted)
serviceUnavailableboolean|absentPresent, and always true, ONLY when our credit service did not answer. Otherwise the key is OMITTED - test for PRESENCE, never for false (=== false never matches). Its absence is meaningful: the service answered, so accepted:false is a real refusal. See the warning below.

Příklad

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"}

A credit-line refusal is not an error. If your line has insufficient balance, this tool returns HTTP 200 with accepted: false and the reason in message — it does not raise an error code. Branch on accepted, not on the HTTP status.

Treat serviceUnavailable: true differently from a refusal. It means our credit service did not answer, so we cannot tell you whether the reservation was applied. It may already be held against your line. Do not blindly retry — the reserve call is not idempotent and a retry can reserve the amount twice. Re-check the booking with get_booking_details before any second attempt.

create_checkout

Vyžaduje autentizaci

Vytvoření URL pro platbu přes Revolut pro připravenou rezervaci. Vrací hostovaný platební odkaz, na který uživatel může kliknout a zaplatit. Po dokončení platby se rezervace automaticky potvrdí prostřednictvím webhooku. Použijte pro B2C spotřebitele.

Požadavek

PoleTypPov.Popis
bookingIdstringYesBooking ID from prepare_booking (preparedBookingId)
currencystringYes3-letter currency code (e.g., USD, EUR, GBP)
backUrlstringNoCancel/back redirect URL (defaults to locktrip.com)
successUrlstringNoSuccess redirect URL

Odpověď

PoleTypPopis
checkoutUrlstringRevolut hosted checkout URL for payment
checkoutTokenstringPayment token for tracking
expiresInMinutesnumberToken expiration time (20 minutes)
messagestringUser instruction message

Příklad

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

Vyžaduje autentizaci

Získání Stripe URL pro platbu připravené rezervace. Vrací URL pro přesměrování zákazníka k dokončení platby kreditní kartou.

Požadavek

PoleTypPov.Popis
bookingIdstringYesBooking ID from prepare_booking (preparedBookingId)
currencystringYesPayment currency code (e.g., USD, EUR)
backUrlstringYesURL to redirect on cancel/back
successUrlstringNoCustom URL to redirect on success

Odpověď

PoleTypPopis
urlstringStripe checkout URL to redirect customer to
sessionIdstringStripe session ID for tracking

Příklad

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

Vyžaduje autentizaci

Seznam rezervací pro autentizovaného uživatele. Filtrování podle stavu: UPCOMING, COMPLETED, CANCELLED nebo PENDING.

Požadavek

PoleTypPov.Popis
typestringNo"UPCOMING", "COMPLETED", "CANCELLED", or "PENDING" (default: "UPCOMING")
pagenumberNoPage number, 0-based. Omit page and size to get the whole filtered list in one response.
sizenumberNoBookings per page, 1–100 (default 100 when only page is sent).

Odpověď

PoleTypPopis
bookingsBookingSummary[]Array of booking summaries
bookings[].bookingIdstringBooking identifier
bookings[].bookingReferenceIdstringLockTrip booking reference
bookings[].hotelNamestringHotel name
bookings[].hotelCitystringALWAYS an empty string — the upstream list record carries no city. Use get_booking_details for the hotel’s city.
bookings[].checkInstringCheck-in date (YYYY-MM-DD)
bookings[].checkOutstringCheck-out date (YYYY-MM-DD)
bookings[].statusstringBooking status (DONE, PENDING, CANCELLED)
bookings[].totalPricenumberNoThe booking price as recorded on the booking. Omitted (never defaulted) when the booking records none, which includes legacy bookings.
bookings[].currencystringNoCurrency of totalPrice, e.g. EUR. Present only together with totalPrice.
bookings[].guestNamestringALWAYS the literal "Guest" — the upstream list record carries no guest name. Use get_booking_details for the real guests.
bookings[].roomCountnumberNumber of rooms
bookings[].createdAtstringBooking creation timestamp (ISO 8601)
bookings[].hotelPhotostring|nullHotel image URL
totalCountnumberNumber of bookings matching type, across all pages.
pagenumberThe page returned, 0-based (0 when no paging was requested).
pageSizenumberThe page size used (the number of bookings returned when no paging was requested).

Příklad

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":"","checkIn":"2027-04-15","checkOut":"2027-04-17","status":"DONE","totalPrice":154.2,"currency":"EUR","guestName":"Guest","roomCount":1,"createdAt":"2026-02-28T09:35:00.000Z","hotelPhoto":"https://static.locktrip.com/hotel-photos/full/d174a039-ebf9-4e42-8b42-5e31a6950b0e.jpeg"}],"totalCount":1,"page":0,"pageSize":1}

# NOTE: this endpoint is a summary index, not a detail view. hotelCity and guestName are not
# populated by the list record. Fetch a bookingId with get_booking_details for guests, city
# and the full price breakdown. Page with {"page":0,"size":20}, then page 1, 2, ...

get_booking_details

Vyžaduje autentizaci

Získání kompletních detailů konkrétní rezervace včetně informací o hotelu, hostů, pokojů, stavu platby a storno podmínek.

Požadavek

PoleTypPov.Popis
bookingIdstringYesBooking ID to retrieve

Odpověď

PoleTypPopis
bookingIdstringBooking identifier
bookingReferenceIdstringLockTrip booking reference
statusstringBooking status (DONE, PENDING, CANCELLED)
hotelobjectHotel details
hotel.namestringHotel name
hotel.addressstringStreet address
hotel.citystringCity
hotel.countrystringCountry
hotel.starRatingnumberStar rating (1-5)
checkInstringCheck-in date (YYYY-MM-DD)
checkOutstringCheck-out date (YYYY-MM-DD)
roomsRoom[]Booked rooms with guests
contactPersonobjectContact person (firstName, lastName, email, phone)
totalPricenumberTotal booking price
currencystringCurrency code
paymentStatusstringPayment status (PAID, PENDING, or CREDIT_LINE for a confirmed B2B booking charged to your credit line; settlement is per statement: GET /api/b2b/credit-line/statement rows carry paymentStatus paid / partially_paid / unpaid)
cancellationPolicyobject|nullCancellation policy with fees and deadlines
createdAtstringBooking creation date
confirmedAtstring|nullConfirmation date (null if pending)

Příklad

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","city":"Plaisir","country":"France","starRating":1},"checkIn":"2027-04-15","checkOut":"2027-04-17","totalPrice":71.34,"currency":"EUR","paymentStatus":"PAID","createdAt":"2026-02-28","confirmedAt":"2026-02-28"}

cancel_booking

Vyžaduje autentizaci

Žádost o zrušení rezervace. Volání s confirmed=false nic nemění a nevrací žádné poplatky: nejprve si přečtěte podmínky přes get_booking_details. Pro provedení zavolejte s confirmed=true. Při úspěchu se vrátí storno poplatek účtovaný dodavatelem, pokud byl nahlášen; refundace se zpracovávají zvlášť.

Požadavek

PoleTypPov.Popis
bookingIdstringYesBooking ID to cancel
confirmedbooleanYesSet true to execute cancellation
reasonstringNoReason for cancellation

Odpověď

PoleTypPopis
successbooleanWhether the cancellation was accepted
messagestringStatus message (dry run, confirmation, or why it was not accepted)
cancellationFeenumberNoOn success: the cancellation fee the supplier charged, as recorded on the booking. Omitted when the supplier reported none (not zero). Refunds are processed separately and are not returned here.
cancellationFeeCurrencystringNoCurrency of cancellationFee.
failureReasonstringNoWhen success is false: NOT_FOUND, AFTER_CHECK_IN, NOT_CANCELLABLE_STATUS, SUPPLIER_NOT_CONFIRMED (submitted and under review: do not rebook or retry) or ERROR (not processed: the booking was not cancelled; try again later or contact support).

Příklad

# Step 1: Dry run (changes nothing, returns no fees)
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 1 changes nothing and returns no penalty figures. Check the terms first with
# check_cancellation_policy (before booking) or get_booking_details -> cancellationPolicy.

# 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 cancellation requested successfully.","cancellationFee":0,"cancellationFeeCurrency":"EUR"}

# Not accepted, e.g. after the check-in date:
{"success":false,"message":"This booking can no longer be cancelled online: the check-in date has been reached.","failureReason":"AFTER_CHECK_IN"}

get_credit_line_statement

Vyžaduje autentizaci

The signed-in partner's own credit-line statement: the real-time balance and the booking rows due in a date window. Partner credit-line accounts only; it takes no account identifier, the line is always your own.

Požadavek

PoleTypPov.Popis
fromstringNoFirst due date to include, YYYY-MM-DD. Pass with to; omit both for the current month.
tostringNoLast due date to include, YYYY-MM-DD, at most 93 days after from.

Odpověď

PoleTypPopis
balanceobjectdue, pending, availableCredit: always for the whole credit line, never filtered by from/to.
bookingsMatured / bookingsPendingobjectRows in the window: bookingReferenceId, hotelName, guestName, dates, amount, currency, bucket (current = due, pending = not due yet), dueDate, paid, outstanding, paymentStatus, settledBy, lineType.
rows[].lineTypestringbooking, or cancellation_fee for a late-cancellation charge.
paymentsReceivedobjectPayments received on the line.

Errors: AUTH_INSUFFICIENT_ROLE (not a credit-line account), AUTH_TOKEN_EXPIRED (sign in again), VALIDATION_ERROR (bad dates or a window over 93 days), PROVIDER_ERROR with serviceUnavailable: true (retry shortly). Limit: 6 calls per minute.

list_settlements

Vyžaduje autentizaci

The partner's own bank-transfer settlements of the credit line. This is the list of transfers, not per-booking payment state (that is on each statement row). Takes no arguments.

Odpověď

PoleTypPopis
settlements[]arrayreference, status, amount, currency, createdAt, expiresAt, and receivedAmount / receivedAt once the transfer arrived.
payable[]arrayTransfers still awaiting funds.
bankobjectThe account to pay into (beneficiary, IBAN, BIC).
noticestringShow this to the user exactly as given: anything sent above the outstanding balance is held as credit, not refunded.

Limit: 20 calls per minute. Creating or cancelling a transfer is not available through MCP.

get_statement_document

Vyžaduje autentizaci

The partner's own monthly statement of account, exactly as it was sent. Statements exist only for months already issued; any other month returns RESOURCE_NOT_FOUND.

Požadavek

PoleTypPov.Popis
periodstringYesStatement month, YYYY-MM.
formatstringNopdf (default) or csv.

Odpověď

PoleTypPopis
filename / mimeTypestringThe document name and type.
csvstringNoformat=csv: the CSV as text.
(embedded resource)resourceNoformat=pdf over MCP: the PDF as an embedded resource (base64). Over REST POST /mcp/tools/get_statement_document the PDF is in contentBase64.

Limit: 6 calls per minute.

Strojově čitelné specifikace: OpenAPI 3.1 | Tool List | MCP Discovery | GraphQL B2B Docs

LockTrip Hotel Booking MCP API v1.0.0

API Documentation - MCP Hotel Booking Reference | LockTrip.com