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.
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>- 1Lea webhook-id, webhook-timestamp (segundos Unix) y webhook-signature. La firma lleva v1, una coma y el valor en base64.
- 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.
- 3Compare en tiempo constante y compruebe que la marca de tiempo sea reciente. Controle además los identificadores ya procesados para evitar duplicados.
- 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
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.
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.