Dokumentation
Geben Sie Ihrem KI-Assistenten aktuelle Verfügbarkeiten für mehr als 290.000 Hotels, Apartments und andere Unterkünfte in Deutschland, Österreich, der Schweiz und den USA: suchen Sie darin, sehen Sie echte Zimmer, Preise in EUR, Stornierungsbedingungen, sofern das Haus sie veröffentlicht, und Zimmerfotos, und buchen Sie das Zimmer, ohne dass der Gast das Gespräch verlässt.
Einrichtung
In Ihre KI einbinden
Eine URL ist die ganze Anbindung: kein Schlüssel, keine Registrierung, keine Anmeldung. Klicken Sie auf das Programm, das Sie verwenden, um seine Installationsschritte zu sehen.
- 1
bluerails in ChatGPT öffnen und installieren
Die Schaltfläche unten öffnet unsere eigene Seite im Plugin-Katalog von ChatGPT. Tippen Sie dort oben rechts auf Install plugin. Es gibt nichts einzufügen, keine Zeile auszuwählen und Sie brauchen keinen Entwicklermodus: der Eintrag steht im Katalog von ChatGPT selbst.
bluerails in ChatGPT öffnenNicht angemeldet, oder der Link landet im Katalog? Dann von Hand: Plugins in der linken Seitenleiste von ChatGPT selbst, unter Library, und dort nach bluerails suchen. Folgen Sie den roten Zahlen.
In ChatGPT: 1 Plugins, in der linken Seitenleiste von ChatGPT selbst, nicht in den Einstellungen, 2 nach bluerails suchen, 3 das Plus in der Zeile mit unserer Bildmarke. Eine Suche nach dem Namen liefert mehrere Zeilen. Unsere ist die mit dem Logo und „Find and book hotels directly“ darunter. Es gibt nichts einzufügen und Sie brauchen keinen Entwicklermodus: der Eintrag steht im Katalog von ChatGPT selbst. Die Ergebniskarte wird in ChatGPT genauso direkt im Chat angezeigt wie in Claude.
- 2
Das war’s. Jetzt einfach fragen.
“Suche mir über den Bluerails-Connector ein Hotel in Bremen für zwei Personen vom 20. bis 23. November, mit kostenfreier Stornierung.”
Nennen Sie den Connector in der Frage, so wie es diese tut. Die meisten Programme haben mehrere, und ein Assistent, der nicht auf
Bluerailsgelenkt wird, beantwortet eine Hotelfrage oft aus dem Gedächtnis oder aus der Websuche. Das liest sich wie eine fehlgeschlagene Installation, ist aber nur ein nicht gefragtes Werkzeug. Wenn Sie beim Hinzufügen einen anderen Namen vergeben haben, nennen Sie diesen.Diese Frage sucht nur. Wenn Sie anschließend um eine Buchung bitten, wird ein echtes Zimmer in einem echten Hotel reserviert, auf den Namen und die E-Mail-Adresse, die Sie angeben. Lesen Sie also zuerst die angezeigten Stornierungsbedingungen.
- 1
Als Connector in Claude hinzufügen
Die Schaltfläche öffnet in Claude die Seite Customize, im Bereich Connectors, mit dem Dialog Add custom connector bereits offen und beiden Feldern bereits ausgefüllt:
Zu Claude hinzufügenBluerailsals Name und die MCP server URL. Prüfen Sie beides und klicken Sie auf Continue. Stellen Sie auf dem nächsten Bildschirm Authentication auf No sign-in. Bleibt eine der beiden Anmeldeoptionen gewählt, sucht Claude nach einem Konto, das dieser Server nicht vergibt. Mit Add wird der Connector angelegt. Seine eigene Seite zeigt dann die Schaltfläche Connect, und erst dieser Klick stellt die Werkzeuge im Chat bereit. Merken Sie sich den Namen: mit ihm richten Sie im Chat eine Frage an diesen Server.Nicht angemeldet oder am Telefon? Dann von Hand: Customize in der linken Seitenleiste von Claude, der Reiter Connectors, dann Add → Add custom connector. Folgen Sie den roten Zahlen.
Sie füllen den Dialog selbst aus, von Hand oder weil er leer aufging? Tragen Sie
Bluerailsals Namen ein und fügen Sie dies bei MCP server URL ein.https://402.bluerails.com/mcpIn Claude: 1 Customize in der linken Seitenleiste, 2 der Reiter Connectors, 3 die Schaltfläche Add oben rechts, 4 Add custom connector. Die Schaltfläche oben führt auf diese Seite, mit dem Dialog bereits offen. Der Dialog Add custom connector von Claude öffnet sich mit beiden Feldern bereits ausgefüllt. Sie prüfen also nur: 5 den Namen Bluerails, mit dem Sie ihn später im Chat nennen, 6 die MCP server URL, 7 Continue. Damit öffnet sich die zweite Hälfte desselben Dialogs, siehe unten.Claude fragt anschließend, wie es sich anmelden soll. Wählen Sie No sign-in, das bei diesem Endpunkt meist schon als Detected markiert ist: 8 No sign-in. Sign in now und Sign in when needed lassen Claude nach einem Konto suchen, das dieser Server nicht vergibt, und der Connector fragt dann nach einer Anmeldung, die es nicht gibt. Danach 9 Add. Request headers bleiben leer: dieser Endpunkt braucht keinen Schlüssel. Hinzufügen heißt noch nicht einschalten. Die Seite des Connectors öffnet sich mit genau diesem Hinweis: 10 Connect. Erst damit stehen die Werkzeuge von Bluerails im Chat zur Verfügung. - 2
Das war’s. Jetzt einfach fragen.
“Suche mir über den Bluerails-Connector ein Hotel in Bremen für zwei Personen vom 20. bis 23. November, mit kostenfreier Stornierung.”
Nennen Sie den Connector in der Frage, so wie es diese tut. Die meisten Programme haben mehrere, und ein Assistent, der nicht auf
Bluerailsgelenkt wird, beantwortet eine Hotelfrage oft aus dem Gedächtnis oder aus der Websuche. Das liest sich wie eine fehlgeschlagene Installation, ist aber nur ein nicht gefragtes Werkzeug. Wenn Sie beim Hinzufügen einen anderen Namen vergeben haben, nennen Sie diesen.Diese Frage sucht nur. Wenn Sie anschließend um eine Buchung bitten, wird ein echtes Zimmer in einem echten Hotel reserviert, auf den Namen und die E-Mail-Adresse, die Sie angeben. Lesen Sie also zuerst die angezeigten Stornierungsbedingungen.
Claude Code, Cursor, VS Code, GitHub Copilot, OpenClaw und alles andere, das MCP spricht. Ihres finden Sie unten; jedes davon ist ein einzelner Klick oder ein einzelner Befehl.
Claude Code
Ein Befehl in Ihrem TerminalClaude Code, ein Befehl
claude mcp add --transport http Bluerails https://402.bluerails.com/mcpclaude mcp list sollte ihn danach als verbunden anzeigen. Dieser Befehl fügt ihn für das aktuelle Projekt hinzu; mit --scope project schreiben Sie stattdessen die gemeinsame .mcp.json, die Ihr ganzes Team erhält.
Cursor
Ein KlickCursor bittet Sie um Ihre Zustimmung und schreibt dann seine Konfigurationsdatei selbst. Kein Schlüssel, keine Datei zum Bearbeiten.
Zu Cursor hinzufügenWenn Cursor sich nicht öffnet, ist es auf diesem Rechner nicht installiert. Fügen Sie die URL stattdessen in dessen MCP-Konfigurationsdatei ein. Die Form dafür steht unten in diesem Reiter.
VS Code
Ein KlickDieselbe Übergabe: VS Code fügt den Server für Sie hinzu, sobald Sie bestätigen.
Zu VS Code hinzufügenWenn VS Code sich nicht öffnet, ist es auf diesem Rechner nicht installiert. Fügen Sie die URL stattdessen in dessen MCP-Konfigurationsdatei ein. Die Form dafür steht unten in diesem Reiter.
GitHub Copilot
Ein Befehl in Ihrem TerminalGitHub Copilot CLI, ein Befehl
copilot mcp add --transport http Bluerails https://402.bluerails.com/mcpSie verwenden Copilot in VS Code? Dann erledigt das die Schaltfläche Zu VS Code hinzufügen oben bereits: Der Agentenmodus bietet alle Server an, die VS Code kennt. Es ist also nichts weiter hinzuzufügen.
In den übrigen Editoren von Copilot, also Visual Studio, JetBrains, Xcode und Eclipse, öffnen Sie Copilot Chat im Agentenmodus, klicken auf das Werkzeugsymbol und dann auf das Pluszeichen und fügen die URL ein. Diese schreiben servers mit einem einfachen url und nicht den Block mcpServers am Ende dieses Reiters.
OpenClaw
Ein Befehl, dann eine PrüfungOpenClaw, ein Befehl
openclaw mcp add Bluerails --url https://402.bluerails.com/mcp --transport streamable-httpDann openclaw mcp doctor Bluerails --probe, um die Verbindung zu sehen und aufzulisten, was er kann.
Verwenden Sie den Befehl und nicht den Konfigurationsblock unten. OpenClaw führt seine Server unter mcp.servers und nennt den Transport streamable-http. Die übertragbare Form würde also als gar nichts gelesen, und der Server würde einfach nie erscheinen.
Alles andere, das MCP spricht
Übertragbare KonfigurationsdateiWindsurf, Zed, Goose, Ihr eigener Code. Fügen Sie dies in die MCP-Konfigurationsdatei Ihres Programms ein und starten Sie es neu.
Übertragbare MCP-Konfiguration
{
"mcpServers": {
"Bluerails": {
"type": "http",
"url": "https://402.bluerails.com/mcp"
}
}
}- Nahezu jedes Programm liest diese Form, aus
~/.cursor/mcp.jsonoder einer.mcp.jsonim Projektverzeichnis. Die eigene.vscode/mcp.jsonvon VS Code ist die einzige Ausnahme: sie verwendetservers, wo der Block obenmcpServersverwendet, und sie liest den Block oben ohnehin aus.mcp.json, es geht also beides. - Vorab einen Blick wert: immer mehr Programme liefern jedes Quartal eine Liste fertiger Connectors mit. Suchen Sie in Ihrem also nach Bluerails, bevor Sie etwas bearbeiten.
Das war’s. Jetzt einfach fragen.
“Suche mir über den Bluerails-Connector ein Hotel in Bremen für zwei Personen vom 20. bis 23. November, mit kostenfreier Stornierung.”
Nennen Sie den Connector in der Frage, so wie es diese tut. Die meisten Programme haben mehrere, und ein Assistent, der nicht auf Bluerails gelenkt wird, beantwortet eine Hotelfrage oft aus dem Gedächtnis oder aus der Websuche. Das liest sich wie eine fehlgeschlagene Installation, ist aber nur ein nicht gefragtes Werkzeug. Wenn Sie beim Hinzufügen einen anderen Namen vergeben haben, nennen Sie diesen.
Diese Frage sucht nur. Wenn Sie anschließend um eine Buchung bitten, wird ein echtes Zimmer in einem echten Hotel reserviert, auf den Namen und die E-Mail-Adresse, die Sie angeben. Lesen Sie also zuerst die angezeigten Stornierungsbedingungen.
Häufige Fragen
- Brauche ich einen API-Schlüssel?
- Nein. Alle Werkzeuge auf diesem Endpunkt sind öffentlich, und er braucht keinen Auth-Header.
- Was ist abgedeckt?
- Mehr als 290.000 Häuser in Deutschland, Österreich und der Schweiz sowie in zehn US-Städten, darunter New York, Los Angeles, Chicago, Miami und weitere.
- Sind die Preise aktuell oder zwischengespeichert?
- Sie werden während des Aufrufs live von der Buchungsseite des jeweiligen Hauses gelesen.
- Welche Währung, und welche Sprache?
- Nur EUR. Die Beschreibung, die wir auf die Ergebniskarte schreiben, kommt auf Deutsch oder Englisch zurück; der Name eines Zimmers und der jeder Preisoption darin bleiben genau so, wie das Haus sie schreibt.
- Bucht ein Aufruf von hotel_reserve ein echtes Zimmer?
- Ja. Jedes Mal eine echte Reservierung in einem echten Haus.
- Kommt mein Assistent je mit Kartendaten in Berührung?
- Nie. Wo ein Hotel bezahlt werden muss, zahlt der Gast auf der Checkout-Seite, und seine Karte wird vorgemerkt und nicht belastet, bis die Buchung im Hotel tatsächlich bestätigt ist. Ihre Karte führen Sie selbst, nicht Ihr Assistent.
- An wen wendet sich der Gast danach?
- Für das Zimmer selbst an das Hotel, mit der Bestätigungsnummer des Hotels. Mit der Bluerails-Referenz erreicht er uns.
- In dieser Dokumentation steht etwas, das mein Assistent noch nicht kann. Warum?
- Programme lesen die Werkzeugliste beim Hinzufügen des Connectors und behalten diese Fassung meist bei. Eine spätere Aktualisierung von uns erreicht einen Assistenten, der ihn schon hat, deshalb nicht unbedingt. Entfernen Sie den Connector und fügen Sie ihn erneut hinzu, in Claude unter Customize → Connectors, in ChatGPT im Web unter Plugins. Die nächste Anfrage läuft dann gegen eine frisch gelesene Liste.
- Mein Assistent hat eine Hotelfrage beantwortet, ohne Bluerails zu verwenden. Warum?
- Nennen Sie den Connector in der Frage. Die meisten Programme haben mehrere, und ein Assistent, der nicht auf
Bluerailsgelenkt wird, beantwortet eine Hotelfrage oft aus dem Gedächtnis oder aus der Websuche. Das wirkt wie eine fehlgeschlagene Installation, ist aber nur ein nicht angefragtes Werkzeug. „Mit Bluerails, finde mir ein Hotel in …“ genügt. Wenn Sie ihm beim Hinzufügen einen anderen Namen gegeben haben, nennen Sie diesen. Das Nennen ist eine Bitte, kein Schalter: der Assistent entscheidet selbst, welche Werkzeuge er aufruft, und kann die Antwort weiterhin anderswoher nehmen. - Etwas stimmt nicht. An wen wende ich mich?
- Bitte wenden Sie sich an uns unter support@bluerails.com.
Das ist die ganze Einrichtung. Unter Nutzung steht, was Sie danach fragen können.
Nutzung
Was Sie fragen können
Der Gast fragt in einem Satz. Die Nächte, die Personen und der Preis werden daraus gelesen, und zurück kommen echte Zimmer zu echten Preisen.
- “Mit
Bluerails, finde mir ein Hotel in Berlin für zwei Personen vom 12. bis 14. November, nicht über 200 € pro Nacht.”
- “Mit
Bluerails, wir suchen ein Familienhotel bei Zell am See vom 18. bis 21. Dezember, zwei Erwachsene und unsere zwei Kinder, 6 und 9 Jahre alt, bis 400 € pro Nacht.”
- “Mit
Bluerails, finde mir ein 4-Sterne-Hotel in Wien vom 15. bis 17. Oktober, für zwei Personen, nicht über 250 € pro Nacht.”

Wie eine Buchung zustande kommt
Zwei Aufrufe, und der Vorgangsschlüssel dazwischen verbindet den einen mit dem anderen. Es gibt keine Sitzung zu eröffnen und auf Ihrer Seite nichts zu speichern.
1.
list_hotelsmit Zeitraum und Personen des GastesJedes Zimmer, für das wir einen Preis abrufen konnten, kommt mit einer
offerIdneben seinem EUR-Preis und seinen Stornierungsbedingungen zurück. Häuser inunpricedhaben keine Zimmer und keinen Schlüssel, dort gibt es also nichts zu reservieren. Lassen Sie den Zeitraum weg, wird kein Preis abgerufen und kein Schlüssel erzeugt.2. Die Zimmer zeigen und den Gast eines auswählen lassen
Zeigen Sie Preis und Stornierungsbedingungen des Zimmers, das der Gast gerade wählt. Wo
cancelTermsnull ist, sagen Sie, dass uns keine vorliegen und die Bedingungen des Hauses selbst gelten. Das ist kein Grund, die Buchung abzulehnen.3.
hotel_reservemit derofferIddieses Zimmers, unverändertHaus, Zimmer, Rate, Zeitraum, Personen und Preis stecken alle im Schlüssel selbst. Deshalb ist keines davon ein eigenes Feld. Sie übergeben Name, E-Mail-Adresse, Telefonnummer und Rechnungsadresse des Gastes sowie
acceptedTerms: true, sobald er dieser Rate zugestimmt hat. Eine Kombination, die dem Gast nie gezeigt wurde, können Sie nicht buchen.4. Lesen, welcher der beiden Abschlüsse zurückkam
confirmationNumberheißt: das Zimmer ist gebucht, der Gast zahlt an der Rezeption des Hotels, und es wurde nichts abgebucht.paymentUrlheißt: das Zimmer ist noch nicht reserviert. Der Gast zahlt auf unserer Seite, seine Karte wird vorgemerkt statt belastet, und wir setzen die Buchung, sobald das geschehen ist. Beide Abschlüsse tragen außerdem einebookingReference, die der Gast nennt, um uns zu erreichen.
Eine offerId gilt 30 Minuten. Braucht der Gast länger, rufen Sie list_hotels mit genau dieser offerId und sonst nichts auf. Das ruft den Preis nur für dieses eine Zimmer neu ab und erzeugt einen frischen Schlüssel, statt dem Gast das ganze Haus ein zweites Mal zu zeigen. Kommt ein Aufruf unklar zurück, rufen Sie nicht erneut auf: es kann bereits eine Reservierung bestehen.
Mehr Infos
Authentifizierung
Keine. Alle Werkzeuge sind öffentlich, der Connector oben funktioniert also sofort, ohne API-Schlüssel und ohne Anmeldeaufforderung. Auf diesem Endpunkt heißt das, dass eine Reservierung mit nichts als der URL zustande kommen kann. Behandeln Sie ihn also wie alles, was Buchungen annimmt. Die übrigen Bereiche (Verlage, Online-Shops, SaaS-Unternehmen) werden über die REST-API bedient und nicht als MCP-Werkzeuge; siehe openapi.json.
Werkzeug-Referenz
list_hotels durchsucht Häuser und ruft, wenn Sie einen Zeitraum mitgeben, im selben Aufruf deren Preise ab. hotel_reserve bucht eines der Zimmer, für die Preise abgerufen wurden. Ein Aufruf erzeugt eine echte Reservierung in einem echten Haus.
list_hotels
Hotels durchsuchen und im selben Aufruf Preise für einen Zeitraum abrufen. Zurück kommen zwei Gruppen: priced, die Häuser, deren aktuelle Preise gelesen wurden, und unpriced, alle übrigen.
Signatur
list_hotels(
city?: string, radius?: { value: number, unit: "km" | "mi" },
query?: string, country?: "de" | "at" | "ch" | "us",
starRating?: "1-star" | "2-star" | "3-star" | "4-star" | "5-star",
style?: "boutique", // independent of starRating: pass both to ask for both
// REQUIRED: ask the guest for these before you search; a call
// missing any of them runs no search and asks for them back
checkIn: string, checkOut: string, adults: number,
maxPricePerNight: number, currency: string,
// currency is ISO 4217 for maxPricePerNight ONLY
// ("EUR" most of the time). Use the one the guest
// already named; ask only for a bare number you
// cannot place. Prices always come back in EUR;
// send their own figure, never one you converted
childrenAges?: (number|null)[], // one entry per child: their age, or null until
// you ask. A null is refused, not priced; a child
// left out is priced as though not coming
language?: string,
limit?: number, // 1-20, default 10. There is no paging
offerId?: string, // re-price ONE room instead of searching: pass a handle
// from an earlier answer and every field above is ignored
) → {
unpriced: Hotel[], // the only field always present
priced?: PricedHotel[], aboveBudget?: PricedHotel[],
place?: string, radiusUsedKm?: number, stay?: Stay,
language?: string, hint?: string,
// when nothing was found, or the input was rejected
placeNotRecognised?: string, nearestBeyondRadiusKm?: number | null,
nearestSearchedToKm?: number, requestedRadiusKm?: number,
maxRadiusKm?: number, error?: string,
}
// limit out of range is a JSON-RPC -32602 error, never clamped.
// radius is two checks: value must be 1-100 whatever the unit, and the
// converted distance must be <= 100 km. The first is a -32602; the second
// is NOT: 63 mi is a normal 200 carrying error, requestedRadiusKm and
// maxRadiusKm, so handle it as data, not as a thrown exception.Beispielaufruf
list_hotels({
city: "Bremen",
radius: { value: 3, unit: "km" },
checkIn: "2026-09-20",
checkOut: "2026-09-22",
adults: 2,
limit: 20,
})Beispielantwort
// A real response, trimmed: one of the 9 priced hotels with one of its 4 rooms, and 2 of
// the 5 unpriced ones. An unpriced hotel carries its own website and no booking link. unpriced
// never holds more than 5, whatever limit asks for; priced is not capped.
{
"place": "Bremen",
"radiusUsedKm": 3,
"stay": {
"checkIn": "2026-09-20",
"checkOut": "2026-09-22",
"adults": 2,
"children": 0
},
"priced": [
{
"slug": "hotel-edel-weiss",
"name": "Hotel Edel Weiss",
"shortDescription": "Hotel Edel Weiss is a 4-star hotel in bremen, DE.",
"tags": ["de", "bremen", "Heinz Vesecky", "wifi", "4-star", "mid-range"],
"websiteUrl": "https://402.bluerails.com/go/dUKHiE78uA1G52v_",
"listing": {
"starRating": "4-star",
"guestRating": 4.5,
"address": {
"street": "Bahnhofsplatz 8",
"postalCode": "28195",
"city": "Bremen",
"countryCode": "de"
},
"city": "Bremen",
"country": "de",
"amenities": ["wifi"]
},
"distanceKm": 0.7753051258616253,
"distanceApproximate": false,
"rooms": [
{
"name": "Economy Doppelzimmer ",
"price": 191.2,
"cancelTerms": "100% (191.2 EUR)",
"soldOut": false,
"ratePlanName": "nicht kostenfrei Stornierbar",
"breakfastIncluded": false,
"bookingUrl": "https://402.bluerails.com/go/PAW3xVPfgBK4A9AL",
"imageUrls": [
"https://cdn.dirs21.de/v1/cdn/images/81426/1000041578.jpg?h=500",
"https://cdn.dirs21.de/v1/cdn/images/81426/1000041579.jpg?h=500"
],
"ratePlans": [
{
"ratePlanName": "Standardrate",
"price": 201,
"cancelTerms": "100% (201 EUR)",
"soldOut": false,
"breakfastIncluded": false,
"bookingUrl": "https://402.bluerails.com/go/P7LJOKLBwSbUT7oc"
},
{
"ratePlanName": "Experience Bremen: a 3-day mini-break",
"price": 222.03,
"cancelTerms": "100% (222.03 EUR)",
"soldOut": false,
"breakfastIncluded": true,
"bookingUrl": "https://402.bluerails.com/go/-1HTu1Z5F5Jdl7Jj"
}
]
}
],
"stayTotal": 191.2,
"pricePerNight": 96,
"bookingUrl": "https://402.bluerails.com/go/XGG8-qKrft7n0GYX",
"datesApplied": true,
"partyApplied": true
}
],
"unpriced": [
{
"slug": "hotel-classico-Bremen",
"name": "Hotel Classico",
"shortDescription": "Hotel Classico is a 4-star boutique hotel in Bremen, DE.",
"websiteUrl": "https://402.bluerails.com/go/ttR9Is3Zd8r_OD-p",
"tags": ["de", "Bremen", "boutique", "independent", "business", "4-star", "mid-range"],
"distanceKm": 0.07897485301717645,
"distanceApproximate": false,
"listing": {
"starRating": "4-star",
"style": "boutique",
"guestRating": 4.5,
"address": {
"street": "Hinter dem Schütting 1 A",
"postalCode": "28195",
"city": "Bremen",
"countryCode": "de"
},
"city": "Bremen",
"country": "de",
"propertyType": "business",
"chain": "independent"
}
},
{
"slug": "hotel-hanseatic",
"name": "Hotel Hanseatic",
"shortDescription": "Hotel Hanseatic is a 3-star hotel in bremen, DE.",
"websiteUrl": "https://402.bluerails.com/go/UfGTZkFVVWnzFIuL",
"tags": ["de", "bremen", "3-star", "independent", "business", "mid-range"],
"distanceKm": 0.33778274072368647,
"distanceApproximate": false,
"listing": {
"starRating": "3-star",
"city": "bremen",
"country": "de",
"propertyType": "business",
"chain": "independent"
}
}
]
}hotel_reserve
Ein Zimmer buchen, das der Gast ausgewählt hat: aus jedem Angebot, für das list_hotels eine offerId geliefert hat. Entweder wird das Zimmer direkt gebucht und der Gast zahlt an der Rezeption, oder es kommt unser Checkout-Link zurück und das Zimmer wird reserviert, sobald bezahlt ist.
Signatur
hotel_reserve(
offerId: string, // from list_hotels, unedited. Valid 30 minutes.
guestGivenName: string,
guestLastName: string,
guestEmail: string, // the guest's own; the hotel's confirmation goes here
guestPhone: string, // any format the guest gives it in
guestStreet: string,
guestPostal: string,
guestCity: string,
guestCountry: string, // 2 letters, where the guest LIVES, not where they travel
guestStreetNo?: string, // when the guest gives it separately from the street
guestSalutation?: string, // only what the guest told you; never guess from a name
acceptedTerms: boolean, // true only after the guest agreed to THIS rate's terms
) → {
// booked outright: the room is held and the guest pays at the desk
confirmationNumber?: string, hotel?: string,
checkIn?: string, checkOut?: string, payment?: string,
// paid-for booking: the room is NOT held until the guest pays
paymentUrl?: string, // OUR checkout. The card is HELD, not charged. The only
// link this tool returns, never the hotel's own page.
// TWO NUMBERS, FOR TWO DIFFERENT PEOPLE, and both endings carry this one.
bookingReference?: string, // OURS: the only thing that lets the guest reach US
// about a booking they made through us. Always present
// on paymentUrl; on confirmationNumber it is absent only
// when the booking could not be recorded, which changes
// nothing else the guest is told.
// on a refusal, and never alongside either ending
error?: string, reason?: string,
// on either: wording meant for the guest rather than for you
tellTheGuest?: string,
}
// The hotel, room, rate, stay, party and price all come out of the signed
// offerId, which is why none of them is a separate argument. You cannot
// book a combination you were never shown, or different nights from the
// ones you searched.
//
// Holding an offerId is the whole qualification: there is no second field
// to check before calling, and no class of offer that is refused for what
// it is rather than for what the engine says when asked.Beispielaufruf
hotel_reserve({
offerId: "ofr3_4KQ2-9XPD-7M3F",
guestGivenName: "Anna",
guestLastName: "Weber",
guestEmail: "anna.weber@example.com",
guestPhone: "+49 421 555 0134",
guestStreet: "Sögestraße",
guestStreetNo: "12",
guestPostal: "28195",
guestCity: "Bremen",
guestCountry: "DE",
acceptedTerms: true,
})Beispielantwort
// Ending one: booked. The confirmation number is the hotel's own reference.
{
"confirmationNumber": "…", // the HOTEL's. What the guest quotes AT the property.
"bookingReference": "…", // OURS. What they quote to reach US.
"hotel": "ACHAT Hotel Bremen City",
"checkIn": "2026-11-20",
"checkOut": "2026-11-23",
"payment": "Nothing has been charged. The guest pays the hotel directly at the desk.",
"tellTheGuest": "Give them the confirmation number and tell them to keep it — the hotel will also email them. To change or cancel the room, they contact the hotel directly."
}
// Ending two: the rate has to be paid for. NOTHING is reserved yet: the
// room is placed after the guest pays, and their card is held, not charged.
{
"paymentUrl": "https://402.bluerails.com/book/…",
"bookingReference": "…", // always here, and it OUTLIVES the link
"hotel": "ACHAT Hotel Bremen City",
"checkIn": "2026-11-20",
"checkOut": "2026-11-23",
"payment": "Nothing has been charged yet. The page holds the card; we take payment only once the hotel confirms the room.",
"tellTheGuest": "Give them this link to pay. Their card is HELD, not charged — we take the money only once the hotel confirms the room, and release the hold if it cannot. The room is NOT reserved until they have paid, so price and availability can still change. The link expires, so if they do not use it soon, call list_hotels with that same offerId to re-price their room, then reserve again for a new link. Their booking reference is … — that is what they quote if they need to reach us, and it outlives the link."
}
// A refusal. This one is real, returned on 25 September 2026 for a call
// that passed acceptedTerms: false. No room is touched before it fires.
{
"error": "The guest has not agreed to book this rate. Show them its cancellation terms where `list_hotels` gave any — where it gave none, tell them we hold none and that the hotel’s own terms apply — then call again once they have agreed.",
"reason": "terms-not-accepted"
}