Primeros pasos con la API de actividades de XeniCómo reservar una actividadCómo buscar etiquetas y categorías de actividadesCómo cancelar una reserva de actividadCómo comprobar la disponibilidad de la actividadCómo obtener detalles de la actividadCómo recuperar los detalles de la reserva de actividadesCómo buscar actividades con filtrosCómo buscar destinos de actividadesAPI de alquiler de coches: introducciónAPI de alquiler de coches: comprensión de los campos de respuestaCómo reservar un alquiler de cochesCómo obtener detalles del vehículo de alquiler y complementos de equipoCómo recuperar o cancelar una reserva de alquiler de cochesCómo buscar autos de alquiler disponiblesCómo buscar ubicaciones de recogidaCómo utilizar los filtros de búsqueda de alquiler de cochesMejores prácticas de integración de API de ofertasPreguntas frecuentes sobre la API de ofertasPrimeros pasos con la API de ofertas de XeniReferencia de encabezados y parámetros de solicitud de API de ofertasOfertas API Monedas admitidas y localizaciónCómo mostrar ofertas en su aplicaciónCómo buscar ofertas de hoteles por ubicaciónCódigos de error de la API de vuelos y solución de problemasPrimeros pasos con la API de vuelos de XeniCómo reservar un vueloCómo comprobar la disponibilidad y el precio de los vuelosCómo confirmar o cancelar una reserva de vueloCómo recuperar las reglas de tarifas de un vueloCómo recuperar los detalles de la reserva de un vueloCómo buscar aeropuertos usando AutocompletarCómo buscar vuelosCómo utilizar filtros, clasificación y paginación de búsqueda de vuelosCómo comprobar la disponibilidad y el precio de las habitacionesCómo filtrar los resultados de los alquileres vacacionalesCómo obtener detalles, comodidades y accesibilidad de la propiedad del resortCómo mantener y confirmar una reserva de resortCómo liberar una retención de resortCómo recuperar los detalles de la reserva del resortCómo buscar complejos turísticos disponiblesCómo buscar destinos turísticosCómo buscar ubicaciones de alquiler vacacionalCómo buscar alquileres vacacionalesCómo utilizar filtros de búsqueda y clasificación de complejos turísticosComenzando con la API de Xeni ResortsAPI de Resorts: comprensión de los estados y políticas de las reservasPrimeros pasos con la API de alquileres vacacionalesPreguntas frecuentes sobre alquileres vacacionalesTipos de propiedades admitidas para alquileres vacacionalesComprensión de la búsqueda asincrónica para alquileres vacacionalesAutenticación y firmas APIReserva de hoteles: API directa y pago SSOManejo de errores, límites de tasas y mejores prácticasPrimeros pasos con la API de Xeni HotelesGestión de reservas: estado, recuperación y cancelaciónConfirmación de precios y ciclo de vida del tokenRecuperar detalles del hotel y disponibilidad de habitacionesBúsqueda de hoteles: ubicaciones, filtros y paginaciónBuscando HotelesGestión de sesiones e ID de correlaciónAutenticación API y obtención de claves API

Reserva de hoteles: API directa y pago SSO

Última actualización: 2026-02-13

Reservas de hoteles: API directa y pago SSO

Una vez que haya confirmado el precio y haya recibido un token de precio, hay dos formas de completar una reserva de hotel a través de la API de Xeni. Este artículo cubre ambos enfoques.

Opciones de reserva de un vistazo

MétodoCómo funcionaMejor Para
API directa BookingLlame al punto final de reserva mediante programación. Procese pagos a través de su propia cuenta de comerciante o mediante el procesamiento de pagos de Xeni.Integraciones empresariales, plataformas de marca blanca, pago personalizado flows.
SSO PagoRedirecciona al invitado a la página de pago alojada de Xeni donde ingresan los detalles de pago y completan la reserva.Integraciones rápidas en las que no desea manejar el procesamiento de pagos.

*

Opción 1: Reserva API directa

El enfoque API directo le brinda control total sobre la experiencia de reserva. Usted recopila los detalles del huésped, procesa el pago a través de su propia cuenta de comerciante (o la de Xeni) y llama al punto final de reservas de Xeni para crear la reserva.

Punto final

POST /hotels/api/v2/bookings?pricingtoken={pricingtoken}

Parámetros de consulta

XENIKBPH 61
ParámetroTipo XENIKBPH56RequeridoDescripción
preciotokenXENIKBPH6 7__stringEl pricing_token de la respuesta de confirmación de precio. No el token de disponibilidad.

Cuerpo de solicitudXENIKBPH93
CampoTipoXE NIKBPH88RequeridoDescripción
bookingid XENIKBPH100stringA identificador de reserva único generado por su sistema.
habitaciones arrayArray de objetos invitados, uno por habitación.
habitaciones[].títuloXENIKBPH123 stringInvitado título (por ejemplo, "Señor", "Señora", "Señora").
habitaciones[].firs tnamestringInvitado primero nombre.
habitaciones[].apellidoXENIKBPH1 53stringInvitado último nombre.
correo electrónico XENIKBPH166stringInvitado dirección de correo electrónico para reservar confirmación.
teléfonoXENIKBPH177 objetoInvitado telefono número.
teléfono.códigopaísXENIKBPH 189stringTeléfono código de país (por ejemplo, "1" para EE. UU.).
número.de.teléfonoXENIKBPH203 stringTeléfono número (solo dígitos).

Solicitud de ejemplo

POST /hotels/api/v2/bookings?pricingtoken=eyJhbGciOiJIUzI1NiJ9.pricingfinal...Authorization: {signature}x-correlation-id: {correlation_id}Content-Type: application/json

{ "bookingid": "XENI-1700000000-ABC123DEF", "rooms": [ { "title": "Mr", "firstname": "John", "lastname": "Smith" } ], "email": "john.smith@example.com", "phone": { "countrycode": "1", "number": "5551234567" }}

Ejemplo de respuesta

JSON
{
  "data": {
    "booking_id": "XENI-1700000000-ABC123DEF",
    "confirmation_number": "HTL-98765",
    "booking_status": "confirmed"
  }
}

Procesamiento de pagos

Al utilizar el enfoque API directo, tiene dos opciones para gestionar los pagos:

  • Su propia cuenta de comerciante: procese el pago a través de su procesador de pagos existente (Stripe, Braintree, Adyen, etc.) antes o después de llamar al punto final de reservas de Xeni. Esto le brinda control total sobre la experiencia de pago, las tarifas y la conciliación.
  • Procesamiento de pagos de Xeni: utilice el comerciante de Xeni para gestionar el cobro de pagos. Comuníquese con su representante de cuenta Xeni para obtener detalles sobre cómo habilitar esta opción y los métodos de pago disponibles.

Recomendado para empresas: La mayoría de los clientes empresariales utilizan la reserva API directa con su propio procesador de pagos. Esto le brinda control total sobre la experiencia de usuario del pago, los métodos de pago y la conciliación financiera.

*

Opción 2: Pago SSO (página alojada)

Si prefiere no encargarse del procesamiento de pagos, Xeni proporciona una página de pago alojada. Generas una URL con los parámetros de la reserva y rediriges al huésped a ella. Xeni gestiona el cobro de pagos y la confirmación de la reserva en la página alojada.

Beneficio: El pago mediante SSO elimina la necesidad de que su aplicación maneje datos de pago confidenciales. Todo el procesamiento de pagos es manejado por la infraestructura de pago compatible con PCI de Xeni.

Entornos de pagoXENIKBPH235 Producción
Medio ambienteBase de pago URL
UAT (Caja de arena)https://lifestyle2.uat.booking.clu bxeni.com
https://lifestyle2.booking.club xeni.com

Estructura de URL de pago

La URL de pago sigue este patrón:

JSON
{checkoutbaseurl}/booknow/hotels/v2/checkout?{parameters}

Parámetros requeridos

Todos los parámetros se pasan como valores de cadena de consulta de URL. Los objetos y matrices deben estar codificados en cadenas JSON y codificados en URL.

XENIKBPH251TipoXENIKBPH255
ParámetroDescripción
correlación nIdstringEl ID de correlación de la búsqueda actual sesión.
startDa testringRegistro fecha en AAAA-MM-DD formato.
endDate stringPagar fecha en AAAA-MM-DD formato.
ubicaciónJSON stringObjeto de ubicación (ver formato a continuación).
ocupaciónJSON stringMatriz de ocupación (ver formato a continuación).
precios TokencadenaEl pricingtoken de la respuesta de confirmación de precio. No la disponibilidad token.
properto tyIdstringEl hotel propertyid.
XENIKBPH340roomIdstringEl habitación id de la disponibilidad respuesta.
stayPeriodJSON stringObjeto de período de estadía con start y end fechas.
nacionalidadJSON stringNacionalidad del huésped objeto.
force ObtenerstringSet a "verdadero".
X ENIKBPH388isOTAstringSet a "true" para OTA integraciones.
pagingJSON cadenaConfiguración de paginación objeto.
preferenciaJSON stringEstablecido en "[]" (JSON vacío matriz).

*

Formatos de parámetros

Objeto de ubicación

JSON
{
  "id": "12345",
  "name": "Miami",
  "full_name": "Miami, Florida, United States",
  "country": "United States",
  "type": "City",
  "location": {
    "lat": 25.7617,
    "long": -80.1918
  }
}

Utilice los datos de ubicación devueltos por el punto final de autocompletar. El id debe ser una cadena.

Matriz de ocupación

JSON
[
  {
    "id": "room11700000000",
    "numOfRoom": 1,
    "adults": 2,
    "childs": 0,
    "childages": []
  }
]

Cada elemento representa una habitación. El campo id debe ser un identificador único (cualquier cadena).

Objeto del período de permanencia

JSON
{
  "start": "2025-06-01",
  "end": "2025-06-05"
}

Objeto de nacionalidad

JSON
{
  "name": "United States",
  "alpha2Code": "US"
}

Objeto de paginación

JSON
{
  "pageNo": 1,
  "pageSize": 50
}

*

Ejemplo completo: creación de la URL de pago

JavaScript

function generateCheckoutUrl(params) {  const baseUrl = 'https://lifestyle2.uat.booking.clubxeni.com';

const location = { id: String(params.location.id), name: params.location.name, fullname: params.location.fullname, country: params.location.country, type: params.location.type || 'City', location: { lat: params.location.lat, long: params.location.long } };

const occupancy = params.occupancy.map((occ, index) => ({ id: room${index + 1}${Date.now()}, numOfRoom: 1, adults: occ.adults, childs: occ.childs || 0, childages: occ.childages || [] }));

const urlParams = new URLSearchParams({ correlationId: params.correlationId, startDate: params.startDate, endDate: params.endDate, forceGet: 'true', isOTA: 'true', location: JSON.stringify(location), nationality: JSON.stringify({ name: 'United States', alpha2Code: 'US' }), occupancy: JSON.stringify(occupancy), paging: JSON.stringify({ pageNo: 1, pageSize: 50 }), preference: JSON.stringify([]), pricingToken: params.pricingToken, propertyId: params.propertyId, roomId: String(params.roomId), stayPeriod: JSON.stringify({ start: params.startDate, end: params.endDate }) });

return ${baseUrl}/booknow/hotels/v2/checkout?${urlParams.toString()};}

Pitón

import jsonfrom urllib.parse import urlencode

def generatecheckouturl(params): base_url = "https://lifestyle2.uat.booking.clubxeni.com"

location = { "id": str(params["location"]["id"]), "name": params["location"]["name"], "fullname": params["location"]["fullname"], "country": params["location"]["country"], "type": params["location"].get("type", "City"), "location": { "lat": params["location"]["lat"], "long": params["location"]["long"] } }

occupancy = [{ "id": f"room{i+1}{int(time.time())}", "numOfRoom": 1, "adults": occ["adults"], "childs": occ.get("childs", 0), "childages": occ.get("childages", []) } for i, occ in enumerate(params["occupancy"])]

query = urlencode({ "correlationId": params["correlationid"], "startDate": params["startdate"], "endDate": params["enddate"], "forceGet": "true", "isOTA": "true", "location": json.dumps(location), "nationality": json.dumps({"name": "United States", "alpha2Code": "US"}), "occupancy": json.dumps(occupancy), "paging": json.dumps({"pageNo": 1, "pageSize": 50}), "preference": json.dumps([]), "pricingToken": params["pricingtoken"], "propertyId": params["propertyid"], "roomId": str(params["roomid"]), "stayPeriod": json.dumps({"start": params["startdate"], "end": params["enddate"]}) })

return f"{base_url}/booknow/hotels/v2/checkout?{query}"

*

Presentando el enlace de pago

Una vez que haya creado la URL, preséntela al invitado. Enfoques comunes:

  • Redireccionamiento del botón: muestra un botón "Completar reserva" que abre la URL de pago en una nueva pestaña.
  • Redireccionamiento automático: lleva al usuario directamente a la página de pago.
  • Iframe integrado: inserte la página de pago dentro de su aplicación (consulte con su representante de Xeni la compatibilidad con iframe).

Ejemplo: botón HTML

<a href="{checkouturl}" target="blank" rel="noopener noreferrer"   style="display: inline-block; padding: 12px 24px;          background-color: #2196F3; color: white;          text-decoration: none; border-radius: 6px;">  Complete Booking</a>

*

Consideraciones importantes

  • Caducidad del token de precio: El token de precio es válido por 10 minutos. Genere la URL de pago inmediatamente después de la confirmación del precio. Si el huésped se retrasa, es posible que tengas que volver a confirmar el precio.
  • Uso único: Cada token de precio se puede utilizar para una única reserva. Una vez completado el pago (o que el token caduque), se debe obtener un nuevo token para cualquier reserva posterior.
  • Formato de ID de correlación: El ID de correlación se debe pasar tal cual desde los encabezados de respuesta de la API. No lo modifiques.
  • Codificación de URL: los objetos JSON en los parámetros de consulta deben estar codificados en URL correctamente. Utilice URLSearchParams (JavaScript) o urllib.parse.urlencode (Python) para manejar la codificación automáticamente.
*

_Artículo siguiente: Gestión de reservas: estado, recuperación y cancelación
_

¿Te resultó útil este artículo?