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.

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 Bluerails gelenkt 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.”
Die Ergebniskarte zur Berlin-Frage: Hotel Kastanienhof, ein 3-Sterne-Haus in Berlin, 1,2 km entfernt, mit vier Zimmern mit Preisen für die zwei Nächte von 238 bis 289 Euro, jeweils mit Fotos und als buchbar markiert.
Was die Berlin-Frage zurückgibt, gekürzt auf das erste Hotel. Live abgerufen am 29. September 2026; Preise und Verfügbarkeiten ändern sich.

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. 1. list_hotels mit Zeitraum und Personen des Gastes

    Jedes Zimmer, für das wir einen Preis abrufen konnten, kommt mit einer offerId neben seinem EUR-Preis und seinen Stornierungsbedingungen zurück. Häuser in unpriced haben 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. 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 cancelTerms null ist, sagen Sie, dass uns keine vorliegen und die Bedingungen des Hauses selbst gelten. Das ist kein Grund, die Buchung abzulehnen.

  3. 3. hotel_reserve mit der offerId dieses Zimmers, unverändert

    Haus, 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. 4. Lesen, welcher der beiden Abschlüsse zurückkam

    confirmationNumber heißt: das Zimmer ist gebucht, der Gast zahlt an der Rezeption des Hotels, und es wurde nichts abgebucht. paymentUrl heiß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 eine bookingReference, 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"
    }