Integrationsleitfaden

Die Booking.com-API: wie der Zugang funktioniert und was sie dir wirklich erlaubt

Geschrieben für Entwickler und technische Gründer, die man auf die Konnektivitäts-APIs von Booking.com angesetzt hat. Hier geht es darum, wie Partnerbenennung und Verbindung pro Unterkunft funktionieren, um das Datenmodell, von dem alles andere abhängt, und um die zwei, drei Verhaltensweisen, durch die ein Preis-Update bei Booking.com auf dem Papier klappt und in der Praxis nichts ändert.

Was die Booking.com-API ist

Die APIs von Booking.com sind für Konnektivitätsanbieter gebaut: die Channel-Manager und Property-Management-Systeme, die Unterkünfte für viele Objekte gleichzeitig synchron halten. Es sind keine Verbraucher-APIs, es gibt keine öffentliche Such- oder Buchungsschnittstelle für Dritte und kein Entwicklerportal, bei dem du dich anmeldest.

Praktisch sind es mehrere Produktflächen unter einer Partnerschaft – Verfügbarkeit und Preise, Buchungen, Einrichtung von Unterkünften und Zimmern, Inhalte, Nachrichten, Bewertungen und Gebühren. Sie verhalten sich unterschiedlich, werden getrennt freigegeben, und Teile der älteren Schnittstelle sind XML statt JSON. Wenn du von Airbnb kommst, gilt fast keine deiner Annahmen mehr.

Wie bekomme ich Zugang zur Booking.com-API?

Drei Ebenen, vergeben von drei verschiedenen Parteien – genau wie bei Airbnb, nur anders geformt.

  1. Booking.com benennt dein Unternehmen als Konnektivitätsanbieter. Du bewirbst dich, wirst geschäftlich und technisch geprüft, und es gibt einen Zertifizierungsschritt für die Schnittstellen, die du nutzen willst. Das ist eine Beziehung auf Unternehmensebene, die Monate dauert.
  2. Du bekommst Zugangsdaten für ein Maschinenkonto. Anders als die OAuth-Tokens pro Gastgeber bei Airbnb handelt ein einziges Maschinenkonto für jede mit dir verbundene Unterkunft. Diese eine Zugangsberechtigung ist der Wirkungsradius deines ganzen Geschäfts, und sie ändert, wie du Fehler liest – siehe den Hinweis unten.
  3. Jede Unterkunft verbindet dich in ihrem eigenen Extranet. Der Gastgeber meldet sich im Booking.com-Extranet an, öffnet die Liste der Konnektivitätsanbieter, sucht deinen Anbieter nach Namen und klickt auf Verbinden. Bis er das tut, kann dein Maschinenkonto diese Unterkunft überhaupt nicht sehen. Er braucht dafür auch seine numerische Hotel-ID.

Funktionen werden getrennt freigegeben, Fläche für Fläche

Die Partnerbenennung ist kein einzelner Schalter. Einzelne Funktionen – Inhalte sind die, die alle erwischt – werden für den Partner getrennt freigeschaltet. Eine Unterkunft kann live sein, Buchungen annehmen und Preis- und Verfügbarkeitsupdates akzeptieren, während Content-Aufrufe 403 liefern. Nichts ist kaputt; diese Funktion wurde nie freigegeben. Prüf, für welche Flächen du tatsächlich berechtigt bist, bevor du Arbeit planst, die von einer davon abhängt.

Ein Maschinenkonto heißt: Ein 401 ist nie das Problem eines einzelnen Gastgebers

Weil jede Unterkunft über dieselbe Zugangsberechtigung läuft, sagt dir der Fehler, welche Ebene versagt hat – und wer die beiden Ebenen verwechselt, verwandelt einen Token-Schluckauf in eine Massentrennung in seiner eigenen Datenbank.

Ein 403, das ungültige Zugangsdaten für ein Hotel meldet, heißt, dass dieser Gastgeber dich in seinem Extranet entfernt hat: eine echte Trennung auf Unterkunftsebene. Ein 401 betrifft das Maschinenkonto selbst und damit alle Unterkünfte gleichzeitig – global, vorübergehend und nie ein Grund, jemanden als getrennt zu markieren. Ein 403 ohne Zugangsdaten-Code ist mehrdeutig und sollte nichts ändern.

Unser eigener Abgleich markiert eine Verbindung nur bei einem 403 auf Hotelebene mit einem ausdrücklichen Code für ungültige Zugangsdaten als getrennt. Alles andere – 401, 429, 5xx, Timeouts, Netzwerkfehler, Parse-Fehler – gilt als unbekannt und ändert keinen Zustand. Ein falscher Alarm während eines Booking.com-Ausfalls ist viel teurer als ein übersehener.

Mit Repull ist die Gastgeberseite eine einzige gehostete Session mit deinem Branding; der Gastgeber erledigt den Schritt im Extranet und fügt seine Hotel-ID ein, und du bekommst eine Verbindung zurück. Die Anleitung findest du unter Booking.com verbinden.

curl -X POST 'https://api.repull.dev/v1/connect/booking' \
  -H 'Authorization: Bearer sk_live_YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{ "redirectUrl": "https://yourapp.com/connected" }'

Unterkünfte, Zimmer und Ratenpläne

Versteh das, und der Rest von Booking.com ergibt sich. Versteh es falsch, und jeder Endpunkt wirkt willkürlich.

Booking.com property   "hotel_id": 5432505        ← the building
└── room               "roomBookingId": 543250501 ← what a guest books
    └── rate plan      "rateId": 98765            ← the terms it sells on
        └── price at an occupancy                ← what you actually write

Eine Unterkunft ist ein Gebäude. Zimmer sind das, was Gäste buchen. Ratenpläne sind die geschäftlichen Bedingungen, zu denen ein Zimmer verkauft wird, und ein Preis gehört zu einem Tupel (Zimmer, Ratenplan, Datum, Belegung) – nicht zu einer Nacht. Eine Villa mit einem Schlafzimmer ist der einfache Fall; ein Aparthotel mit zwanzig Einheiten ist eine einzige Unterkunft mit zwanzig Zimmern, und das ist normal, kein Randfall.

Dieselbe Einheit kann auch unter mehr als einer Booking.com-Unterkunft auftauchen, meist weil sie im Lauf der Zeit neu eingestellt wurde, und ein Zimmer, das keinem deiner Inserate zugeordnet ist, gehört zu nichts – seine Buchungen haben keinen Landeplatz. Ordne Zimmer im Verbindungsablauf zu, nicht danach.

Zwei ID-Räume in Pfaden, die gleich aussehen

Booking.com-Integrationen tragen eine Booking-Hotel-ID und deine eigene Inserats-ID nebeneinander, und die falsche zu übergeben erzeugt ein 404, das genau wie ein Berechtigungsproblem aussieht.

Bei Repull gilt die Faustregel: Eine ID im Pfad ist eine Repull-Inserats-ID, während property_id als Query- oder Body-Feld eine Booking.com-Hotel-ID ist. Also nimmt GET /v1/channels/booking/properties/{id}/rooms eine Inserats-ID, und PUT /v1/channels/booking/availability eine Hotel-ID. Die Benennung ist historisch gewachsen, und sie zu ändern würde jede bestehende Integration brechen, deshalb nennen die Fehlermeldungen den ID-Raum. Die vollständige Tabelle steht unter Unterkünfte und Inserate auf Booking.com.

Kann ich über die Booking.com-API Preise ändern?

Ja, und das ist die meistgenutzte Fläche der ganzen Partnerschaft. Du schreibst einen Preis für ein Zimmer in einem Ratenplan über einen Datumsbereich, optional mit Aufenthalts- und Anreiseeinschränkungen im selben Aufruf.

curl -X PUT 'https://api.repull.dev/v1/channels/booking/availability' \
  -H 'Authorization: Bearer sk_live_YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "rates",
    "property_id": "1234567",
    "updates": [{
      "roomId": "123456701",
      "rateId": "98765",
      "dateRange": { "start": "2026-11-04", "end": "2026-11-04" },
      "price": 210,
      "currency": "USD",
      "occupancy": 4
    }]
  }'

roomId und rateId kommen aus GET /v1/channels/booking/properties/{id}/rooms. Alles andere an der Anfrage – und das ist mehr, als du erwartest – steht unter Booking.com-Preise aktualisieren.

Warum hat mein Preis-Update bei Booking.com nichts bewirkt?

Das ist die Frage, die Leute auf diese Seite bringt, und es gibt zwei unabhängige Antworten. Beide sehen nach Erfolg aus.

Die Belegung ist Teil des Schlüssels, keine Präferenz

Booking.com speichert nicht „den Preis dieser Nacht“. Es speichert einen Preis für eine Nacht für eine Personenzahl in einem Ratenplan. Die Belegung, die du schickst, entscheidet also, welchen Preis du überschreibst. Jeder Betrag geht mit einer Belegung raus, ob du sie angibst oder nicht.

Repull ermittelt die Belegung aus den eigenen Daten von Booking.com für das Paar (Zimmer, Ratenplan), wenn du sie weglässt, gibt dir den verwendeten Wert und seine Herkunft zurück und lehnt den Schreibzugriff mit einem 422 ab, wenn sie sich nicht ermitteln lässt. Ein Betrag wird nie blind gesendet.

Die Quittung ist keine Bestätigung

Booking.com beantwortet einen Raten-Schreibzugriff meist mit einer nackten Quittung ohne Status pro Datum. Der Body ist wörtlich:

{"ok": ""}

Das ist eine Quittung für die Anfrage, nicht der Stand des Preises

Nichts in dieser Antwort sagt, dass der Preis an auch nur einem der gesendeten Daten live ist. Jede Integration, die darauf gestützt „alle Updates übernommen“ meldet, rät – und der eine Fall, in dem sie falsch liegt, eine nicht passende Belegung, ist genau der, den sie nicht sehen kann.

Die einzig ehrliche Antwort ist, die Daten zurückzulesen und zu vergleichen. Schreibzugriffe werden asynchron übernommen, also muss das Zurücklesen eine kurze Wartezeit abwarten, und es kostet einen zusätzlichen Lesezugriff pro Aufruf. Repull macht das standardmäßig und meldet einen von vier Zuständen: verified, unverified (Zurücklesen übersprungen oder nicht möglich – unbekannt, nicht übernommen), mismatch (mit den Daten und dem, was Booking.com stattdessen hat) oder rejected. Übergib verify: false für ein langes Backfill, das du separat abgleichen willst.

Datumsbereiche und die Nacht, die du verlierst

Darunter nimmt das XML für Verfügbarkeit und Preise einen Bereich, dessen to-Datum nicht geschriebenwird – eine exklusive Grenze, so wie ein Abreisedatum die letzte Nacht ausschließt. Die meisten Kalender, die du vorher integriert hast, behandeln beide Enden als Nächte. Die natürliche Lesart von „1. bis 7. August“ sind also sieben Nächte, auf der Leitung sind es sechs, und die Nacht, die du unbemerkt verlierst, ist die letzte jedes Bereichs, den du schreibst.

Es ist eine einzeilige Umrechnung und ein wochenlanger Bug, weil er dich immer nur die letzte Nacht kostet: Der Kalender sieht weitgehend richtig aus, eine Stichprobe passt, und die Lücke zeigt sich als verpasste Buchung statt als Fehler.

Wähl eine Konvention und rechne an der Grenze um

Die Schnittstelle von Repull ist an beiden Enden inklusiv – bei Preisen, Verfügbarkeit und Einschränkungen gleichermaßen –, also ist start gleich end genau eine Nacht, und 2026-11-04 bis 2026-11-07 sind vier Nächte. Die Umrechnung ins exklusive Format passiert einmal, intern, damit sie nicht an jeder Aufrufstelle falsch laufen kann. Was auch immer du baust: Triff diese Entscheidung einmal, nicht pro Endpunkt.

Inventar ist ein eigener Schreibzugriff

Eine Nacht zu bepreisen öffnet sie nicht für den Verkauf, und sie zu öffnen gibt ihr keinen Preis. Verfügbare Zimmer und der Verkaufsstopp sind ein eigener Update-Typ; sie in einem Preis-Update mitzuschicken wird abgelehnt, statt still verworfen.

# Close a night: zero rooms to sell, stop-sell on
curl -X PUT 'https://api.repull.dev/v1/channels/booking/availability' \
  -H 'Authorization: Bearer sk_live_YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{
    "type": "availability",
    "property_id": "1234567",
    "updates": [{
      "roomId": "123456701",
      "rateId": "98765",
      "dateRange": { "start": "2026-11-04", "end": "2026-11-04" },
      "availableRooms": 0,
      "closed": true
    }]
  }'

Details unter Verfügbarkeit an Booking.com senden. Wenn du lieber einmal einen Kalender schreibst und ihn auf allen verbundenen Kanälen landen lässt, ist das PUT /v1/availability/{propertyId}, mit PATCH /v1/availability/batch für viele Unterkünfte auf einmal.

Einschränkungen, die es gibt – und die es nicht gibt

Mindest- und Höchstaufenthalt (nach Aufenthaltsdatum und nach Anreisedatum), Anreisesperre und Abreisesperre gibt es wirklich, und sie lassen sich pro Zimmer, Ratenplan und Datumsbereich setzen.

Mehrere Einschränkungen, die Leute erwarten, sind in der Benachrichtigung, die Booking.com akzeptiert, schlicht nicht enthalten – darunter eine exakte Aufenthaltsdauer bei Anreise und eine minimale oder maximale Vorausbuchungsfrist. Das richtige Verhalten ist, sie laut abzulehnen. Eine Einschränkung, die angenommen und dann nicht gesendet wird, ist der eine Fehler, den du in keiner Antwort sehen kannst, deshalb antwortet Repull mit 422 und nennt das Feld, statt es zu verwerfen. Siehe restriction_not_supported und Mindestaufenthalt und Einschränkungen.

Buchungen, Nachrichten, Bewertungen und Gebühren

Die Funktionsmatrix stellt Airbnb und Booking.com nebeneinander und markiert Teilweises als teilweise, statt es aufzurunden.

Warum gibt die Content-API 403 zurück?

Weil Inhalte eine eigene Produktfläche mit eigener Berechtigung und eigenem Basispfad sind, getrennt von Verfügbarkeit, Preisen und Buchungen. Eine Unterkunft kann voll live sein – Buchungen annehmen, jeden Preis- und Verfügbarkeitszugriff akzeptieren, den du schickst –, während jeder Content-Aufruf für dieselbe Unterkunft 403 liefert.

Wenn das passiert, verdächtigt man reflexhaft den Token, dann die Unterkunfts-ID, dann die Extranet-Berechtigungen des Gastgebers. Meist ist es nichts davon. Die Funktion wurde dir für diese Fläche nicht freigegeben, und Neuverbinden ändert das nicht. Klär, welche Funktionen deine Partnerschaft wirklich umfasst, bevor du Foto- oder Beschreibungsverwaltung in ein Release einplanst.

Inhalte decken, wo verfügbar, Fotos, Beschreibungen, Ausstattung, Einrichtungen und Richtlinien ab, auf Unterkunfts- oder Zimmerebene – und Booking.com prüft Textänderungen, bevor sie erscheinen, ein Schreibzugriff ist also der Anfang eines Prozesses, nicht sein Ende. Inhalte und Fotos.

Was es heißt, das selbst zu bauen

  1. Partnerbenennung und Zertifizierung. Monate, mit geschäftlicher Prüfung und einer technischen Zertifizierung pro Fläche. Du kannst keinem Kunden einen Termin versprechen.
  2. Ein Sicherheitsmodell mit geteilten Zugangsdaten. Ein Maschinenkonto für jede Unterkunft, die du betreust. Rotation, Speicherung und ein Fehler-Klassifizierer, der sorgfältig genug ist, dass ein globales 401 während eines Ausfalls nicht alle deine Kunden auf einmal trennt.
  3. Das Modell und die Zuordnung. Von Unterkünften zu Zimmern, zu Ratenplänen und zu deinen eigenen Inseraten, inklusive Unterkünften mit mehreren Zimmern, neu eingestellten Einheiten und nicht zugeordneten Zimmern, deren Buchungen nirgendwohin können.
  4. Überprüfung von Schreibzugriffen. Weil die Quittung nichts beweist, liest eine korrekte Integration zurück und gleicht ab. Das ist ein zusätzlicher Aufruf, eine Wartezeit und eine Zustandsmaschine – auf deinem heißesten Pfad.
  5. Konventionen, die nicht zusammenpassen. Exklusive Datumsgrenzen, belegungsabhängige Preise, Inventar getrennt von Preisen, Einschränkungen, die es nicht gibt, XML, wo du JSON erwartet hast.
  6. Ständige Brüche. Wie bei jeder Partner-API: Das geht nie auf null.

Ehrlich zusammengefasst: Booking.com ist eine schwerere Integration als Airbnb und teilt fast keine seiner Annahmen – anderes Authentifizierungsmodell, anderes Datenmodell, andere Datumssemantik, andere Definition eines erfolgreichen Schreibzugriffs. Teams, die gerade mit Airbnb fertig sind, unterschätzen es jedes Mal. Der Leitfaden zur Airbnb-API ist der Vergleich.

Wo Repull ins Spiel kommt

Repull ist eine REST-API mit einem Schlüssel für Booking.com, Airbnb, Vrbo, Plum Guide und die Property-Management-Systeme, die Gastgeber bereits nutzen. Wir halten die Partnerbeziehungen; Unterkünfte verbinden sich selbst über einen gehosteten Ablauf mit deinem Branding.

Fang mit dem Quickstart an oder lies die Kanal-Übersicht. Wenn du eine Plattform bist, die das für ihre eigenen Kunden einbaut statt für sich selbst, deckt der Leitfaden für Plattformen dieses Modell Frage für Frage ab.

Wenn die Unterkünfte, die du integrierst, schon in einem Property-Management-System liegen, ist das ein zweites, eigenes Problem: Ein PMS gibt dir seine Sicht auf eine Buchung, nicht die API des Kanals. Die Leitfäden zu Guesty, Hostaway, Hospitable, Lodgify und OwnerRez zeigen, was jedes davon bereitstellt, und die Abdeckungsmatrix hat sie alle. Ein Schlüssel deckt gleichzeitig eine PMS-Verbindung und eine direkte Kanalverbindung ab.

Häufige Fragen

Wie bekomme ich Zugang zur Booking.com-API?

Booking.com gibt API-Zugang an benannte Konnektivitätsanbieter, nicht an einzelne Integratoren. Ein Unternehmen bewirbt sich, wird geprüft und bekommt Zugangsdaten für ein Maschinenkonto, das im Namen vieler Unterkünfte mit Booking.com spricht. Danach muss jede Unterkunft diesen Anbieter in ihrem eigenen Extranet verbinden, bevor das Maschinenkonto sie sehen kann. Die Partnerbenennung ist ein geschäftlicher Prozess, der Monate dauert; das Verbinden pro Unterkunft kostet den Gastgeber etwa fünf Minuten.

Warum hat mein Preis-Update bei Booking.com nichts bewirkt?

Meistens, weil der Betrag eine Belegung genannt hat, für die der Ratenplan keinen Preis hat. Booking.com speichert nicht den Preis einer Nacht, sondern den Preis einer Nacht für eine bestimmte Personenzahl in einem Ratenplan. Schickst du eine Belegung über dem Maximum, für das der Plan Preise hat, nimmt Booking.com die Anfrage an und verwirft den Betrag stillschweigend – die Nacht behält ihren alten Wert, oft 0.00, und die Bestätigung sieht genauso aus wie bei einem erfolgreichen Schreibzugriff. Schickst du eine darunter, bekommst du ein 400. Lies die Belegung des Ratenplans bei Booking.com aus, statt die Kapazität deines eigenen Inserats anzunehmen.

Bestätigt ein Raten-Schreibzugriff bei Booking.com, dass der Preis live ist?

Nein. Booking.com beantwortet einen Raten-Schreibzugriff meist mit einer leeren Bestätigung, deren Body wörtlich {"ok": ""} ist. Das ist eine Quittung für die Anfrage, keine Bestätigung des Preises. Wissen kannst du es nur, indem du die Daten danach zurückliest und vergleichst. Repull macht das standardmäßig und meldet verifiziert, nicht verifiziert, Abweichung oder abgelehnt, statt zu behaupten, alle Updates seien übernommen.

Warum wird meine letzte Nacht bei Booking.com nicht aktualisiert?

Weil der Datumsbereich im zugrunde liegenden XML sein Enddatum nicht einschließt, während die meisten Kalender, die du schon integriert hast, es einschließen. Schickst du den 1. bis 7. August und erwartest sieben Nächte, schreibst du sechs. Leg fest, welche Konvention deine eigene API nutzt, und rechne einmal um, an der Grenze. Repull nutzt einen an beiden Enden inklusiven Bereich – Start gleich Ende ist genau eine Nacht – und rechnet intern um.

Warum gibt die Content-API von Booking.com 403 zurück, obwohl Buchungen funktionieren?

Weil Funktionen getrennt freigegeben werden. Inhalte liegen auf einer eigenen Produktfläche mit eigener Berechtigung, eine Unterkunft kann also für Buchungen, Verfügbarkeit und Preise voll live sein, während jeder Content-Aufruf 403 liefert. Es ist kein Token-Problem und keine falsche Unterkunfts-ID, und Neuverbinden ändert nichts – die Funktion muss für den Partner und die Unterkunft freigeschaltet sein.

Was kostet eine Booking.com-Integration?

Booking.com berechnet für die Konnektivität selbst nichts; die Kosten liegen in der Partnerbenennung, der Entwicklung und dem Betrieb der Integration. Was eine Integration über Repull kostet, erfährst du per Mail an hello@repull.dev mit deiner Anzahl an Unterkünften und den Kanälen, die du brauchst – wir machen dir ein Angebot.

Sprich mit uns über den Booking.com-Zugang

Erzähl uns, wie viele Unterkünfte du verbinden willst, welche Flächen du brauchst – Preise, Inhalte, Nachrichten, Finanzdaten – und was du außer Booking.com noch anbindest. Wir melden uns mit dem Aufbau der Integration und den Kosten.