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

Mejores prácticas de integración de API de ofertas

Última actualización: 2026-03-03

Ofertas API Mejores prácticas para la integración

Este artículo cubre una guía lista para producción para integrar la API de ofertas en su aplicación. Seguir estas prácticas le ayudará a ofrecer una experiencia de ofertas rápida y fiable y, al mismo tiempo, ser un buen consumidor de API.

Estrategias de almacenamiento en caché

Las ofertas de hoteles cambian con frecuencia, pero no cambian con cada solicitud. La implementación de una capa de almacenamiento en caché reduce la latencia, reduce el volumen de llamadas a la API y proporciona una mejor experiencia de usuario.

Duración de caché recomendada

Un TTL (tiempo de vida) de caché de 5 a 10 minutos logra un buen equilibrio entre frescura y eficiencia. Las ofertas son urgentes, pero no se actualizan cada segundo.

  • 5 minutos: adecuado para páginas con mucho tráfico donde los usuarios esperan ofertas actualizadas.
  • 10 minutos: apropiado para páginas con poco tráfico o precarga en segundo plano.

Diseño de clave de caché

Incluya todos los parámetros de consulta y encabezados relevantes en su clave de caché para evitar ofrecer resultados obsoletos o no coincidentes:

deals:{lat}:{long}:{currency}:{top_destination}:{language}

Redondee las coordenadas a 2 o 3 decimales en su clave de caché para aumentar las tasas de aciertos de caché. Dos decimales de precisión de latitud/longitud cubren aproximadamente 1,1 km, lo que es lo suficientemente cercano para buscar ofertas:

JAVASCRIPT
function buildCacheKey(lat, long, currency, topDestination, language) {
  const roundedLat = lat.toFixed(2);
  const roundedLong = long.toFixed(2);
  return deals:${roundedLat}:${roundedLong}:${currency}:${topDestination}:${language};
}

Caché del lado del servidor

Si su aplicación tiene un backend, almacene en caché las respuestas de la API allí para beneficiar a todos los usuarios que solicitan ofertas para la misma área:

JAVASCRIPT
const cache = new Map();

async function getDeals(lat, long, currency, options = {}) {
const key = buildCacheKey(lat, long, currency, options.topDestination, options.language);
const cached = cache.get(key);

if (cached && Date.now() - cached.timestamp < 5 60 1000) {
return cached.data;
}

const data = await fetchDealsFromAPI(lat, long, currency, options);
cache.set(key, { data, timestamp: Date.now() });
return data;
}

Para sistemas de producción, considere usar Redis o Memcached en lugar de un caché en memoria.

Caché del lado del cliente

En la interfaz, puede usar el almacenamiento de sesiones o un almacén en memoria para evitar llamadas redundantes cuando los usuarios regresan a la página de ofertas:

JAVASCRIPT
function getCachedDeals(key) {
  const raw = sessionStorage.getItem(key);
  if (!raw) return null;

const { data, timestamp } = JSON.parse(raw);
if (Date.now() - timestamp > 5 60 1000) {
sessionStorage.removeItem(key);
return null;
}
return data;
}

Frecuencia de sondeo

Si su aplicación muestra ofertas en una página de larga duración (como un panel o una página de inicio), actualice periódicamente los datos para mantenerlos actualizados.

Intervalos recomendados

EscenarioIntervalo
Página de ofertas activas (visualización del usuario)5 a 10 minutos
Pestaña FondoPausar el sondeo
Widget de página de inicio10 a 15 minutos
Aplicación móvil (primer plano)5 a 10 minutos
Aplicación móvil (fondo)No encuestar

Pausa cuando no esté visible

Evite desperdiciar llamadas API cuando el usuario no esté mirando la página:

JAVASCRIPT
let pollTimer = null;

function startPolling(fetchFn, intervalMs) {
fetchFn();
pollTimer = setInterval(fetchFn, intervalMs);
}

function stopPolling() {
clearInterval(pollTimer);
pollTimer = null;
}

document.addEventListener('visibilitychange', () => {
if (document.hidden) {
stopPolling();
} else {
startPolling(fetchDeals, 5 60 1000);
}
});

Manejo de errores

El sólido manejo de errores garantiza que la función de ofertas se degrade con elegancia en lugar de romper la página.

Códigos de estado HTTP

EstadoSignificadoAcción
200ÉxitoAnalizar y mostrar las ofertas.
400Solicitud incorrectaVerifique sus parámetros. Probablemente un valor de latitud, longitud o moneda no válido.
401No autorizadoVerifique sus credenciales de API y encabezados de autenticación.
404No encontradoConfirme que la URL del punto final sea correcta.
429Demasiadas solicitudesHa excedido el límite de tarifa. Retroceda y vuelva a intentarlo después del período indicado.
500Error interno del servidorVuelva a intentarlo con retroceso exponencial. Si persiste, comuníquese con el soporte de Xeni.
503Servicio no disponibleLa API está temporalmente inactiva. Vuelva a intentarlo después de un breve retraso.

Reintentar con retroceso exponencial

Para errores transitorios (429, 500, 503), implemente un retroceso exponencial:

JAVASCRIPT
async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    try {
      const response = await fetch(url, options);

if (response.ok) {
return response.json();
}

if (response.status === 429 || response.status >= 500) {
if (attempt < maxRetries) {
const delay = Math.pow(2, attempt) 1000 + Math.random() 1000;
await new Promise(resolve => setTimeout(resolve, delay));
continue;
}
}

throw new Error(API returned ${response.status}: ${response.statusText});
} catch (error) {
if (attempt === maxRetries) throw error;
const delay = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delay));
}
}
}

Manejo sin resultados

Una respuesta exitosa con una matriz de ofertas vacía no es un error. Manéjelo como un estado normal en su interfaz de usuario:

  • Mostrar un mensaje amigable "No hay ofertas disponibles".
  • Sugiera al usuario que pruebe una ubicación diferente o vuelva a consultar más tarde.
  • Opcionalmente, recurra a una consulta top_destination=true para mostrar ofertas populares.

Limitación de velocidad

Si bien los límites de tarifas exactos dependen de su plan API, siga estas pautas generales:

  • No llame a la API con cada pulsación de tecla o evento de desplazamiento. Evite los cambios de ubicación y las interacciones del usuario.
  • Utilice el almacenamiento en caché para atender solicitudes repetidas desde su caché en lugar de acceder a la API.
  • Supervise su uso y configure alertas si se acerca al umbral de su límite de tarifa.
  • Respeta las respuestas 429 retrocediendo como se describe arriba.

Combinar ofertas con búsqueda de hoteles

La API de ofertas es una herramienta de descubrimiento: muestra a los usuarios qué descuentos están disponibles. Para completar una reserva, normalmente necesitarás utilizar la API de Hoteles.

Un flujo recomendado:1. Mostrar ofertas: utilice la API de ofertas para mostrar ofertas atractivas en su página de inicio o en su página de ofertas.

  1. El usuario selecciona una oferta: cuando un usuario hace clic en una oferta, captura el ID de la propiedad.
  2. Verificar disponibilidad: llame al punto final de disponibilidad de la API de hoteles con el ID de la propiedad, las fechas de entrada y salida y el recuento de huéspedes.
  3. Confirmar precio: utilice el punto final de confirmación de precio de la API de hoteles para fijar la tarifa.
  4. Completar reserva: continúe con el flujo de reserva de la API de hoteles.

Esta transferencia de la API de Ofertas a Hoteles brinda a los usuarios la mejor experiencia: descubren ofertas fácilmente y luego pasan a un flujo de reservas completo con precios confirmados en tiempo real.

Mejores prácticas de correlación e ID de sesión

  • x-correlation-id: genera un nuevo UUID para cada llamada a la API. Esto facilita el seguimiento de solicitudes individuales en los registros.
  • x-session-id: reutiliza el mismo UUID para todas las llamadas API dentro de una única sesión de usuario. Esto ayuda a Xeni a correlacionar solicitudes del mismo recorrido del usuario.
  • Registrar ambos ID: almacene ambos ID en los registros de su aplicación. Si un usuario informa un problema, puede proporcionárselo al soporte de Xeni para una depuración rápida.

Consejos de rendimiento

  • Carga diferida de imágenes de ofertas: utilice loading="lazy" en imágenes de tarjetas de ofertas para evitar bloquear la representación de la página inicial.
  • Precargue ofertas para ubicaciones comunes: si su aplicación atiende a un mercado específico, precargue ofertas para las principales ciudades de esa región.
  • Utilice renderizado del lado del servidor: para SEO y rendimiento de carga inicial, renderice tarjetas de ofertas en el servidor e hidrátelas en el cliente.
  • Minimizar cambio de diseño: reserve espacio para tarjetas de ofertas (por ejemplo, usando tarjetas esqueleto) para que la página no salte cuando se carguen datos.

¿Te resultó útil este artículo?