Guía de integración

La API de Booking.com: cómo funciona el acceso y qué te permite hacer de verdad

Escrita para el ingeniero o el fundador técnico al que han mandado a las APIs de conectividad de Booking.com. Explica cómo funcionan la designación como partner y la conexión por propiedad, el modelo de datos del que depende todo lo demás, y los dos o tres comportamientos que hacen que un cambio de tarifas en Booking.com funcione sobre el papel y no cambie nada en la práctica.

Qué es la API de Booking.com

Las APIs de Booking.com están pensadas para proveedores de conectividad: los channel managers y sistemas de gestión de propiedades que mantienen el alojamiento sincronizado en nombre de muchas propiedades a la vez. No son APIs para consumidores, no hay una superficie pública de búsqueda o reserva para terceros y no hay un portal de desarrolladores en el que registrarse.

En la práctica son varias superficies de producto bajo una misma relación: disponibilidad y tarifas, reservas, configuración de propiedad y habitaciones, contenido, mensajes, reseñas y cargos financieros. Se comportan de forma distinta entre sí, se conceden por separado y partes de la superficie más antigua son XML y no JSON. Si vienes de Airbnb, casi ninguna de tus premisas se mantiene.

¿Cómo consigo acceso a la API de Booking.com?

Tres capas, concedidas por tres partes distintas, igual que en Airbnb pero con otra forma.

  1. Booking.com designa a tu empresa como proveedor de conectividad. Lo solicitas, te evalúan comercial y técnicamente, y hay un paso de certificación para las superficies que quieres usar. Es una relación a nivel de empresa que se mide en meses.
  2. Recibes credenciales para una cuenta de máquina. A diferencia de los tokens OAuth por anfitrión de Airbnb, una sola cuenta de máquina actúa por todas las propiedades conectadas contigo. Esa única credencial es el radio de impacto de todo tu negocio, y cambia cómo debes leer los errores; mira la nota de abajo.
  3. Cada propiedad te conecta desde su propia Extranet. El anfitrión entra en la Extranet de Booking.com, abre la lista de proveedores de conectividad, busca tu proveedor por nombre y pulsa Conectar. Hasta que lo hace, tu cuenta de máquina no puede ver esa propiedad. También necesitará tener a mano su Hotel ID numérico.

Las capacidades se conceden por separado, superficie por superficie

La designación como partner no es un único interruptor. Las capacidades individuales —el contenido es la que pilla a la gente— se habilitan por separado para el partner. Una propiedad puede estar activa, recibiendo reservas y aceptando escrituras de tarifas y disponibilidad, mientras las llamadas de contenido responden 403. No hay nada roto; esa capacidad nunca se concedió. Comprueba a qué superficies tienes derecho de verdad antes de planificar trabajo que dependa de una.

Una sola cuenta de máquina significa que un 401 nunca es problema de un solo anfitrión

Como todas las propiedades pasan por la misma credencial, el error que recibes te dice qué capa ha fallado, y confundir las dos capas es como un fallo puntual de token se convierte en una desconexión masiva en tu propia base de datos.

Un 403 que indica credenciales no válidas para un hotel significa que ese anfitrión te ha revocado en su Extranet: una desconexión real, a nivel de propiedad. Un 401 es la propia cuenta de máquina y afecta a todas las propiedades a la vez: global, pasajero y nunca un motivo para marcar a nadie como desconectado. Un 403 sin código de credenciales es ambiguo y no debería cambiar nada.

Nuestro propio conciliador solo marca una conexión como desconectada ante un 403 a nivel de hotel con un código explícito de credenciales no válidas. Todo lo demás —401, 429, 5xx, tiempos de espera, errores de red, fallos de parseo— se clasifica como desconocido y no toca ningún estado. Un falso positivo durante una caída de Booking.com sale mucho más caro que uno que se escapa.

Con Repull, la parte de cara al anfitrión es una única sesión alojada con tu marca; el anfitrión completa el paso en la Extranet y pega su Hotel ID, y tú recibes una conexión. El paso a paso está en Conectar Booking.com.

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

Propiedades, habitaciones y planes de tarifa

Si entiendes esto, el resto de Booking.com encaja. Si no, cada endpoint parece arbitrario.

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

Una propiedad es un edificio. Las habitaciones son lo que reservan los huéspedes. Los planes de tarifa son las condiciones comerciales con las que se vende una habitación, y un precio pertenece a una combinación (habitación, plan de tarifa, fecha, ocupación), no a una noche. Una villa de un dormitorio es el caso sencillo; un aparthotel de veinte unidades es una única propiedad con veinte habitaciones, y eso es lo normal, no un caso raro.

La misma unidad también puede aparecer en más de una propiedad de Booking.com, normalmente porque se volvió a publicar con el tiempo, y una habitación que no está asignada a uno de tus anuncios no pertenece a nada: sus reservas no tienen dónde caer. Asigna las habitaciones durante el flujo de conexión, no después.

Dos espacios de ids en rutas que se leen igual

Las integraciones con Booking.com llevan un id de hotel de Booking y tu propio id de anuncio uno junto al otro, y pasar el que no es produce un 404 que parece exactamente un problema de permisos.

En Repull la regla es: un id en la ruta es un id de anuncio de Repull, mientras que property_id como parámetro o campo del cuerpo es un id de hotel de Booking.com. Así que GET /v1/channels/booking/properties/{id}/rooms recibe un id de anuncio, y PUT /v1/channels/booking/availability recibe un id de hotel. Los nombres son históricos y cambiarlos rompería todas las integraciones que ya los usan, así que los mensajes de error indican el espacio de ids. La tabla completa está en Propiedades y anuncios en Booking.com.

¿Puedo actualizar tarifas con la API de Booking.com?

Sí, y es la superficie más usada de toda la relación. Escribes un precio para una habitación en un plan de tarifa sobre un rango de fechas, opcionalmente con restricciones de estancia y de llegada en la misma llamada.

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 y rateId salen de GET /v1/channels/booking/properties/{id}/rooms. Todo lo demás de la petición —y hay más de lo que esperas— está en Actualizar precios en Booking.com.

¿Por qué mi cambio de precio en Booking.com no hizo nada?

Es la pregunta que trae a la gente a esta página, y tiene dos respuestas independientes. Las dos parecen un éxito.

La ocupación forma parte de la clave, no es una preferencia

Booking.com no guarda “el precio de esta noche”. Guarda un precio para una noche para un número de personas en un plan de tarifa. Así que la ocupación que envías decide qué precio estás sobrescribiendo. Cada importe se envía con una, la indiques o no.

Repull obtiene la ocupación de los propios datos de Booking.com para el par (habitación, plan de tarifa) cuando no la indicas, te devuelve el valor usado y de dónde salió, y rechaza la escritura con un 422 cuando no puede resolverla. Nunca se envía un importe a ciegas.

El acuse de recibo no es una confirmación

Booking.com suele responder a una escritura de tarifas con un acuse de recibo sin estado por fecha. El cuerpo es literalmente:

{"ok": ""}

Es un recibo de la petición, no el estado del precio

Nada en esa respuesta dice que el precio esté publicado en ninguna de las fechas que enviaste. Cualquier integración que informe de “todos los cambios aplicados” basándose en eso está adivinando, y el único caso en que se equivoca —una ocupación que no coincide— es justo el que no puede ver.

La única respuesta honesta es volver a leer las fechas y comparar. Las escrituras se aplican de forma asíncrona, así que la relectura tiene que esperar un breve tiempo de asentamiento, y cuesta una lectura extra por llamada. Repull lo hace por defecto e informa de uno de cuatro estados: verified, unverified (no se hizo la relectura o no estaba disponible: desconocido, no aplicado), mismatch (indicando las fechas y lo que tiene Booking.com en su lugar) o rejected. Pasa verify: false para una carga larga que vayas a conciliar aparte.

Rangos de fechas y la noche que pierdes

Por debajo, el XML de disponibilidad y tarifas recibe un rango cuya fecha to no se escribe: es un límite exclusivo, igual que la fecha de salida excluye la última noche. La mayoría de calendarios que habrás integrado antes tratan los dos extremos como noches. Así que lo natural es leer “del 1 al 7 de agosto” como siete noches, pero en la petición son seis, y la noche que pierdes sin darte cuenta es la última de cada rango que escribes.

Es una conversión de una línea y un bug de una semana, porque solo te cuesta la última noche: el calendario parece más o menos bien, una comprobación rápida pasa, y el hueco aparece como una reserva perdida en lugar de como un error.

Elige una convención y convierte en el límite

La superficie de Repull es inclusiva en ambos extremos —en tarifas, en disponibilidad y en restricciones por igual—, así que start igual a end es exactamente una noche, y 2026-11-04 a 2026-11-07 son cuatro noches. La conversión al formato exclusivo se hace una sola vez, por dentro, para que no pueda fallar en cada llamada. Construyas lo que construyas, toma esa decisión una vez y no endpoint por endpoint.

El inventario es una escritura aparte

Poner precio a una noche no la abre a la venta, y abrirla no le pone precio. Las habitaciones a la venta y el cierre de ventas son su propio tipo de actualización; enviarlos en una actualización de tarifas se rechaza en lugar de ignorarse en silencio.

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

Detalles en Enviar disponibilidad a Booking.com. Si prefieres escribir un calendario una sola vez y que llegue a todos los canales conectados, eso es PUT /v1/availability/{propertyId}, con PATCH /v1/availability/batch para muchas propiedades a la vez.

Restricciones que existen y otras que no

La estancia mínima y máxima (por fecha de estancia y por fecha de llegada), el cierre a la llegada y el cierre a la salida existen y se pueden fijar por habitación, plan de tarifa y rango de fechas.

Varias restricciones que la gente espera simplemente no están en la notificación que acepta Booking.com, entre ellas una duración exacta de estancia en la llegada y la antelación mínima o máxima de reserva. Lo correcto es rechazarlas de forma visible. Una restricción que se acepta y luego no se envía es el único fallo que no puedes ver en una respuesta, así que Repull responde 422 indicando el campo en lugar de descartarlo. Consulta restriction_not_supported y Estancia mínima y restricciones.

Reservas, mensajes, reseñas y cargos

La matriz de capacidades pone Airbnb y Booking.com uno al lado del otro, y marca lo parcial como parcial en lugar de redondearlo hacia arriba.

¿Por qué la Content API devuelve 403?

Porque el contenido es su propia superficie de producto, con su propio permiso y su propia ruta base, separada de las superficies de disponibilidad, tarifas y reservas. Una propiedad puede estar totalmente activa —recibiendo reservas y aceptando todas tus escrituras de tarifas y disponibilidad— mientras cada llamada de contenido para esa misma propiedad responde 403.

Cuando pasa, el instinto es sospechar del token, luego del id de la propiedad y luego de los permisos del anfitrión en la Extranet. Normalmente no es nada de eso. La capacidad no se te concedió para esa superficie, y reconectar no lo cambia. Confirma qué capacidades incluye de verdad tu relación de partner antes de meter la gestión de fotos o descripciones en una versión.

El contenido, donde está disponible, cubre fotos, descripciones, servicios, instalaciones y políticas, a nivel de propiedad o de habitación, y Booking.com revisa los cambios de texto antes de publicarlos, así que una escritura es el inicio de un proceso, no el final. Contenido y fotos.

Lo que cuesta construirlo por tu cuenta

  1. Designación como partner y certificación. Meses, con revisión comercial y un paso de certificación técnica por superficie. No puedes prometer una fecha a ningún cliente.
  2. Un modelo de seguridad con credencial compartida. Una sola cuenta de máquina para todas las propiedades a las que das servicio. Rotación, almacenamiento y un clasificador de errores lo bastante cuidadoso como para que un 401 global durante una caída no desconecte en masa a tus clientes.
  3. El modelo y la asignación. De propiedades a habitaciones, a planes de tarifa y a tus propios anuncios, incluidas propiedades con varias habitaciones, unidades republicadas y habitaciones sin asignar cuyas reservas no tienen adónde ir.
  4. Verificación de escrituras. Como el acuse de recibo no prueba nada, una integración correcta vuelve a leer y concilia. Eso es una llamada más, un tiempo de espera y una máquina de estados, en la ruta más caliente que tienes.
  5. Convenciones que no encajan. Límites de fecha exclusivos, precios ligados a la ocupación, inventario separado de las tarifas, restricciones que no existen, XML donde esperabas JSON.
  6. Roturas continuas. Igual que con cualquier API de partners: nunca llega a cero.

El resumen honesto es que Booking.com es una integración más pesada que Airbnb y no comparte casi ninguna de sus premisas: otro modelo de autenticación, otro modelo de datos, otra semántica de fechas y otra definición de escritura correcta. Los equipos que acaban de terminar Airbnb siempre lo subestiman. La guía de la API de Airbnb es la comparación.

Dónde encaja Repull

Repull es una API REST y una sola clave para Booking.com, Airbnb, Vrbo, Plum Guide y los sistemas de gestión de propiedades que los anfitriones ya usan. Nosotros tenemos las relaciones con los partners; las propiedades se conectan solas a través de un flujo alojado con tu marca.

Empieza por la guía de inicio rápido, o lee el resumen de canales. Si eres una plataforma que integra esto para sus propios clientes, y no para ti, la guía para plataformas cubre ese modelo pregunta por pregunta.

Si las propiedades que estás integrando ya están en un sistema de gestión de propiedades, ese es un segundo problema distinto: un PMS te da su propia visión de una reserva, no la API del canal. Las guías de Guesty, Hostaway, Hospitable, Lodgify y OwnerRez explican lo que expone cada uno, y la matriz de cobertura los tiene todos. Una sola clave cubre a la vez una conexión con un PMS y una conexión directa con un canal.

Preguntas frecuentes

¿Cómo consigo acceso a la API de Booking.com?

Booking.com da acceso a su API a proveedores de conectividad designados, no a integradores individuales. Una empresa lo solicita, la evalúan y recibe credenciales para una cuenta de máquina que habla con Booking.com en nombre de muchas propiedades. Después, cada propiedad tiene que conectar a ese proveedor desde su propia Extranet antes de que la cuenta de máquina pueda verla. La designación como partner es un proceso comercial que se mide en meses; el paso de conexión por propiedad le lleva al anfitrión unos cinco minutos.

¿Por qué mi cambio de precio en Booking.com no hizo nada?

Casi siempre porque el importe indicaba una ocupación a la que ese plan de tarifa no pone precio. Booking.com no guarda el precio de una noche; guarda el precio de una noche para un número de personas en un plan de tarifa. Si envías una ocupación por encima del máximo que tiene precio en el plan, Booking.com acepta la petición y descarta el importe sin decir nada: la noche se queda con lo que tenía, a menudo 0.00, y la confirmación es idéntica a la de una escritura correcta. Si envías una por debajo, recibes un 400. Lee la ocupación del plan de tarifa desde Booking.com en lugar de suponer la capacidad de tu propio anuncio.

¿Una escritura de tarifas en Booking.com confirma que el precio está publicado?

No. Booking.com suele responder a una escritura de tarifas con una confirmación vacía cuyo cuerpo es literalmente {"ok": ""}. Es un acuse de recibo de la petición, no la confirmación del precio. La única forma de saberlo es volver a leer las fechas después y comparar. Repull hace esa relectura por defecto e informa de verificado, sin verificar, discrepancia o rechazado en lugar de afirmar que se aplicaron todos los cambios.

¿Por qué no se actualiza mi última noche en Booking.com?

Porque el rango de fechas del XML subyacente no incluye la fecha final, mientras que la mayoría de calendarios que habrás integrado sí la incluyen. Envía del 1 al 7 de agosto esperando siete noches y escribirás seis. Decide qué convención expone tu propia API y convierte una sola vez, en el límite. Repull expone un rango inclusivo en ambos extremos —inicio igual a fin es exactamente una noche— y hace la conversión internamente.

¿Por qué la Content API de Booking.com devuelve 403 si las reservas funcionan bien?

Porque las capacidades se conceden por separado. El contenido está en su propia superficie de producto con su propio permiso, así que una propiedad puede estar totalmente activa para reservas, disponibilidad y tarifas mientras cada llamada de contenido responde 403. No es un problema de token ni de id de propiedad, y reconectar no lo cambia: la capacidad tiene que estar habilitada para el partner y la propiedad.

¿Cuánto cuesta una integración con Booking.com?

Booking.com no cobra por la conectividad en sí; el coste está en la designación como partner, la ingeniería y operar la integración. Para saber cuánto cuesta una integración a través de Repull, escribe a hello@repull.dev con tu número de propiedades y los canales que necesitas y te daremos un presupuesto.

Habla con nosotros sobre el acceso a Booking.com

Cuéntanos cuántas propiedades esperas conectar, qué superficies necesitas —tarifas, contenido, mensajes, finanzas— y qué más vas a conectar junto a Booking.com. Te diremos cómo sería la integración y cuánto cuesta.