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

Autenticación y firmas API

Última actualización: 2026-02-13

Autenticación y firmas API

Cada solicitud a la API de Xeni debe incluir una firma válida en el encabezado Authorization. Esto se aplica a todos los productos API: hoteles, automóviles, vuelos, actividades, complejos turísticos, ofertas y contenido. Las firmas se generan utilizando su clave y secreto API y caducan después de 30 minutos. Este artículo cubre cómo generar, usar y actualizar firmas.

Cómo funciona la autenticación

  1. Envía su clave API, secreto y una marca de tiempo Unix al punto final de generación de firma.
  2. La API devuelve una firma (un token JWT firmado).
  3. Incluye esta firma en el encabezado Authorization de todas las llamadas API posteriores.
  4. Cuando la firma está a punto de caducar, generas una nueva.

Generando una firma

Punto final

POST /identity/v2/auth/generate

Cuerpo de solicitud

XENIKBP H20
ParámetroTipo RequeridoDescripción
apikey stringSu API Xeni clave.
secret XENIKBPH_39__stringSu API Xeni secreto.
marca de tiempo enteroActual Marca de tiempo de Unix en segundos (no milisegundos).

Solicitud de ejemplo

POST https://api.travelapi.ai/identity/v2/auth/generateContent-Type: application/json

{ "api_key": "eb8c1638-7fde-48f3-98fe-7ea8d06327d7", "secret": "your-secret-here", "timestamp": 1700000000}

Ejemplo de respuesta

JSON
{
  "signature": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}

Usando la firma

Pase la firma como valor del encabezado Authorization en cada llamada API:

GET /api/v2/{product}/endpoint
Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Content-Type: application/json

Caducidad de la firma

Las firmas son válidas por 30 minutos desde el momento en que se generan. Después de eso, cualquier llamada a la API que utilice una firma caducada devolverá un error de autenticación.

Recomendado: estrategia de actualización automática

Para evitar interrupciones durante las sesiones activas, recomendamos actualizar su firma proactivamente en lugar de esperar a que caduque. Un patrón común:

  • Almacenar la firma y la hora en que se generó.
  • Verifique la antigüedad de la firma antes de cada llamada a la API (o en un temporizador recurrente).
  • Si a la firma le quedan menos de 5 minutos, genera una nueva.

Ejemplo: Lógica de actualización automática (JavaScript)

class SignatureManager {  constructor(apiKey, secret, baseUrl) {    this.apiKey = apiKey;    this.secret = secret;    this.baseUrl = baseUrl;    this.signature = null;    this.expiresAt = null;  }

async generateSignature() { const response = await fetch(${this.baseUrl}/identity/v2/auth/generate, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ api_key: this.apiKey, secret: this.secret, timestamp: Math.floor(Date.now() / 1000) }) });

const data = await response.json(); this.signature = data.signature; this.expiresAt = Date.now() + (30 60 1000); // 30 minutes return this.signature; }

needsRefresh() { if (!this.signature || !this.expiresAt) return true; // Refresh if less than 5 minutes remaining return (this.expiresAt - Date.now()) < (5 60 1000); }

async getSignature() { if (this.needsRefresh()) { await this.generateSignature(); } return this.signature; }}

Ejemplo: lógica de actualización automática (Python)

import timeimport requests

class SignatureManager: def init(self, apikey, secret, baseurl): self.apikey = apikey self.secret = secret self.baseurl = baseurl self.signature = None self.expires_at = 0

def generatesignature(self): response = requests.post( f"{self.baseurl}/identity/v2/auth/generate", json={ "apikey": self.apikey, "secret": self.secret, "timestamp": int(time.time()) } ) data = response.json() self.signature = data["signature"] self.expires_at = time.time() + (30 * 60) # 30 minutes return self.signature

def needsrefresh(self): if not self.signature: return True return (self.expiresat - time.time()) < (5 * 60) # 5-min threshold

def getsignature(self): if self.needsrefresh(): self.generate_signature() return self.signature

Errores de autenticación comunes

XENIKBP H_73
HTTP EstadoCausaResolución
401Falta o Autorización encabezadoAsegúrese de incluir la firma en el encabezado.
401Expirado firmaGenerar una nueva firma. Las firmas caducan después de 30 minutos.
401Clave API no válida o secretVerifique que sus credenciales sean correctas y active.
400La marca de tiempo está demasiado lejos del servidor timeAsegúrese de que el reloj de su sistema sea preciso. Utilice Math.floor(Date.now() / 1000) o equivalente.

Mejores prácticas de seguridad- Nunca exponga su secreto de API en el código del lado del cliente. Toda la generación de firmas debe realizarse en el lado del servidor.

  • Almacene las credenciales de forma segura. Utilice variables de entorno o un administrador de secretos; nunca codifique las credenciales en los archivos fuente.
  • Rote los secretos con regularidad. Comuníquese con su representante de cuenta Xeni para rotar su secreto de API.
  • Supervise los errores 401. Un aumento en los errores de autenticación puede indicar que las credenciales están comprometidas.

¿Te resultó útil este artículo?