Ir al contenido
StayParity

Control de precios para motores de reservas y grupos hoteleros.

Comparamos el precio directo de cada hotel con Booking.com, Expedia y los vendedores de Google Hotels. Sus sistemas pueden recibir las discrepancias mediante un webhook firmado.

POSThttps://pms.example.com/hooks/paritydisparity.opened
Content-Type: application/json
webhook-id: ns4k8w2q7c1m9x5t3h6v0b2r8d7f4j1g
webhook-timestamp: 1791547324
webhook-signature: v1,Xq0c…e21a=

{
  "version": 1,
  "id": "ns4k8w2q7c1m9x5t3h6v0b2r8d7f4j1g",
  "event": "disparity.opened",
  "disparityId": "jn7cq2b1x9d8w4fzr3m6kt5v0h7s2e8a",
  "hotel": {
    "id": "kd72mbx0vy4p9s1c6tqh8wf3gr5n2j7e",
    "name": "Hotel Aurora"
  },
  "ota": "booking",
  "stayDate": "2026-10-16",
  "occupancy": 2,
  "directPriceEurMinor": 18900,
  "otaPriceEurMinor": 17900,
  "deltaEurMinor": 1000,
  "deltaPct": 5.29,
  "confidence": "confirmed",
  "detectedAt": "2026-10-09T12:02:00.000Z"
}

Datos ilustrativos del hotel ficticio Hotel Aurora.

Motores de reservas

Seguimiento con distintos motores de reservas. BON es la primera conexión directa. También controlamos hoteles que utilizan otros motores.

Conexión directa

Con un conector compatible obtenemos la tarifa del motor tal como la ve el visitante. La primera conexión disponible es BON.

A través de Google Hotels

Para otros motores usamos el precio de la web oficial en Google Hotels. No requiere instalación ni acceso al motor.

Nuevas colaboraciones

Cada integración mantiene los mismos tipos de revisión y alertas. Si desarrolla un motor o channel manager, escríbanos para estudiar la conexión.

Webhooks

Una alerta firmada por cada nueva discrepancia. Enviamos JSON al endpoint configurado para el hotel. El campo version indica la versión del formato.

Campos del mensaje

version
La versión actual es 1. Pueden añadirse campos sin cambiar la versión; ignore los desconocidos.
id
Identificador del envío. Se mantiene en los reintentos, tanto en el cuerpo como en webhook-id. Úselo para evitar procesar duplicados.
event
disparity.opened indica una nueva discrepancia. Es el único evento disponible.
disparityId
Identificador de la discrepancia.
hotel
Identificador y nombre del hotel en StayParity.
ota
Código de canal en minúsculas: booking, expedia o el vendedor encontrado en Google Hotels.
stayDate
Fecha de estancia en formato YYYY-MM-DD.
occupancy
Número de huéspedes por habitación.
directPriceEurMinor
Precio directo en céntimos de euro.
otaPriceEurMinor
Precio del canal en céntimos de euro.
deltaEurMinor
Diferencia entre su precio y el precio inferior del canal, en céntimos.
deltaPct
Diferencia como porcentaje del precio directo, con dos decimales.
confidence
confirmed: comprobación en la plataforma. sweep: observación mediante un agregador de precios.
detectedAt
Momento de la primera detección en UTC.

Envío y reintentos

  • POST con Content-Type application/json a una dirección HTTPS pública
  • Una respuesta 2xx en 10 segundos confirma la recepción
  • Las respuestas 5xx y los tiempos de espera agotados generan reintentos con intervalos crecientes
  • Las respuestas 4xx son rechazos y no se reintentan
  • No seguimos redirecciones; indique la dirección final

Criterios de alerta

  • Se aplican los umbrales de importe y porcentaje y los canales elegidos para cada hotel
  • Se envían discrepancias confirmadas, salvo que la regla del hotel incluya también observaciones del agregador
  • El evento se genera al abrir la discrepancia, no repetidamente mientras sigue abierta
  • Puede usar un endpoint por hotel o uno común para varios

Verificación de firma

HMAC-SHA256 sobre el identificador, la marca de tiempo y el cuerpo original. La firma sigue Standard Webhooks. Puede utilizar sus bibliotecas oficiales.

webhook-id: <the payload's id>
webhook-timestamp: <unix seconds>
webhook-signature: v1,<base64 HMAC-SHA256>
  1. 1Lea webhook-id, webhook-timestamp (segundos Unix) y webhook-signature. La firma lleva v1, una coma y el valor en base64.
  2. 2Calcule HMAC-SHA256 sobre id.timestamp.body, con puntos separadores y sin alterar el cuerpo. Quite whsec_ del secreto y decodifique el resto desde base64.
  3. 3Compare en tiempo constante y compruebe que la marca de tiempo sea reciente. Controle además los identificadores ya procesados para evitar duplicados.
  4. 4Los reintentos conservan webhook-id y se firman con una nueva marca de tiempo.

Cada cuenta tiene un secreto para todos sus hoteles. Un administrador lo crea en la aplicación y solo se muestra una vez. Un nuevo secreto sustituye al anterior.

Verificación en Node.js

JavaScript
import { createHmac, timingSafeEqual } from "node:crypto";

// Or let the official library do it: npm install standardwebhooks, then
// new Webhook(secret).verify(rawBody, headers) throws unless it checks out.
// rawBody: the request body exactly as it arrived, before JSON.parse.
// headers: the request headers, with Node's lower-case names.
// secret: your whole signing secret, whsec_ prefix included.
function verify(rawBody, headers, secret, toleranceSeconds = 300) {
  const id = headers["webhook-id"];
  const timestamp = Number(headers["webhook-timestamp"]);
  if (!id || !Number.isInteger(timestamp)) return false;
  if (Math.abs(Date.now() / 1000 - timestamp) > toleranceSeconds) return false;
  const key = Buffer.from(secret.replace(/^whsec_/, ""), "base64");
  const expected = createHmac("sha256", key).update(`${id}.${timestamp}.${rawBody}`).digest();
  return String(headers["webhook-signature"] ?? "").split(" ").some((entry) => {
    const [version, signature = ""] = entry.split(",", 2);
    const given = Buffer.from(signature, "base64");
    return version === "v1" && given.length === expected.length && timingSafeEqual(given, expected);
  });
}

Ejemplos en Python y PHP, reintentos y pruebas en la documentación

Gestión de la cuenta

Todos sus hoteles en una cuenta. Para grupos y socios que trabajan con varios alojamientos.

Configuración por hotel

Cada hotel tiene su lista de discrepancias, umbrales y endpoint. Puede cambiar de hotel desde la aplicación.

Roles del equipo

Los administradores gestionan miembros y secretos. Los miembros gestionan discrepancias y eligen sus alertas.

Configuración inicial

Nuestro equipo añade hoteles y configura alertas y accesos. No requiere instalación en los hoteles.

Colaboraciones

Ofrezca StayParity a sus hoteles. Hablemos del modelo y los términos adecuados para su empresa.

Recomendación

Nos recomienda hoteles con los que trabaja. Nos encargamos de la configuración y del soporte.

Reventa

Incorpore StayParity a los servicios que ofrece a sus hoteles.

Hablemos de una colaboración

Preguntas frecuentes

Sobre integraciones y colaboraciones. Escríbanos para otras consultas.

¿Es obligatorio utilizar BON?
No. BON es la primera conexión directa, pero también controlamos otros motores mediante el precio de la web oficial en Google Hotels.
¿Hay una API pública?
Todavía no hay una API pública para datos de cuenta. Las notificaciones salientes utilizan webhooks. Escríbanos sobre sus necesidades.
¿Tengo que instalar algo?
No para el seguimiento ni las alertas. El widget opcional de reserva directa necesita una etiqueta script en su web.
Envíenos su pregunta