Si tu hotel trabaja con un sistema desarrollado a medida, o con un PMS o motor que WeSpeak todavía no integra, puedes conectarlo por API. Tu equipo técnico publica dos endpoints con el formato de WeSpeak y, desde ahí, el asistente consulta precios y disponibilidad en vivo en tu sistema y carga ahí las reservas que se cierran por chat.
ℹ️ No es lo mismo que WeSpeak Rates sin PMS ni Channel Manager: ahí WeSpeak es tu sistema. Aquí tu sistema sigue mandando y WeSpeak lo consulta.
En este artículo
- Qué necesitas
- Cómo se conecta, paso a paso
- El contrato: disponibilidad (GET)
- El contrato: reservas (POST)
- Antes de abrir la venta
- Qué no hace
- Errores frecuentes
- Preguntas frecuentes
Qué necesitas
| Qué | ¿Obligatorio? | Para qué sirve |
|---|---|---|
| Un endpoint GET de disponibilidad y precios, con HTTPS y accesible desde internet | ✅ Sí | El asistente cotiza con los datos de tu sistema |
| Un endpoint POST de creación de reservas | Solo si vas a reservar | La reserva del chat entra a tu sistema. Requiere WeSpeak Payments |
| Una API key | Recomendada | Tu sistema sabe que la llamada viene de WeSpeak. Llega en el encabezado X-API-Key |
| Tus habitaciones cargadas en WeSpeak, con el mismo nombre que devuelve tu sistema | ✅ Sí | WeSpeak une tus precios con las fotos, descripciones y capacidades de cada habitación |
💡 Si tu PMS o tu Channel Manager ya está integrado con WeSpeak, no necesitas esto: pídele a tu asesor la conexión nativa. Mira Conoce WeSpeak Rates.
Cómo se conecta, paso a paso
- Pide la activación a tu asesor. El equipo de WeSpeak activa la Integración personalizada en tu propiedad y te aparece la sección en tu panel.
- Carga tus endpoints en Configuración → Integración personalizada: la URL de disponibilidad, la URL de reservas y la API key. Cada campo se guarda solo al salir de él.
- Prueba desde la misma pantalla. Probar disponibilidad consulta tu endpoint en vivo y te marca, campo por campo, qué no cumple el formato. Probar creación de reserva envía una reserva de prueba que tu sistema no debe crear.
- Haz una cotización real por chat y compara los precios con los de tu sistema.
- Valida las reservas con la lista de Antes de abrir la venta.

En la misma pantalla, Ver formato esperado muestra el contrato con ejemplos: es el mismo de este artículo.
🛠️ ¿Dudas técnicas sobre el contrato? Tu equipo de desarrollo puede escribirle directamente al nuestro a tecnologia@wespeak.pro.
El contrato: disponibilidad (GET)
Cada vez que el asistente necesita cotizar, WeSpeak llama a tu URL agregando estos parámetros:
GET https://api.tuhotel.com/wespeak/availability?channel=custom&username=tu-hotel&channelPass=&checkinDate=2026-11-10&checkoutDate=2026-11-12¤cy=USD&persons=2&adults=2&kids=1&childrenAge=8 X-API-Key: tu-api-key
| Parámetro | Qué es |
|---|---|
checkinDate, checkoutDate | Fechas de la estadía, en formato YYYY-MM-DD |
adults, kids | Cantidad de adultos y de niños |
childrenAge | Edades de los niños separadas por coma (4,8). Solo llega si hay niños |
currency | Moneda que pidió el huésped, código ISO de 3 letras |
username | Identificador de tu propiedad, que acuerdas con tu asesor. Sirve si un mismo endpoint atiende a varios hoteles |
persons, channel, channelPass | Se envían por compatibilidad; puedes ignorarlos. persons repite la cantidad de adultos |
Tu endpoint responde con este JSON:
{
"available": true,
"rooms": [
{
"name": "Doble Superior",
"code": "DBL",
"currency": "USD",
"bookable": true,
"unitsLeft": 3,
"minStay": 2,
"maxStay": 14,
"rates": [
{ "name": "Tarifa Flexible", "code": "FLEX", "totalPrice": "300.00" },
{ "name": "No Reembolsable", "code": "NR", "totalPrice": "260.00" }
]
}
]
}
| Campo | ¿Obligatorio? | Regla |
|---|---|---|
available | ✅ | true si hay al menos una habitación reservable para esas fechas |
rooms[].name | ✅ | Igual al nombre de la habitación en WeSpeak. No distingue mayúsculas, pero sí el texto: "Doble Superior" no es "Superior" |
rooms[].currency | ✅ | Código ISO de 3 letras. Usa la misma moneda en todas las habitaciones |
rooms[].rates[].totalPrice | ✅ | Precio total de la estadía para esa habitación, no por noche |
rooms[].code, rates[].code | Para reservar | Códigos estables de tu sistema. Te los devolvemos tal cual al crear la reserva |
rooms[].bookable, unitsLeft | Recomendados | Si se puede reservar y cuántas unidades quedan |
minStay, maxStay | Opcionales | Noches mínimas y máximas, como dato informativo |
Reglas que conviene respetar desde el primer día:
- "Sin disponibilidad" no es un error. Responde
200conavailable: false. Deja los códigos4xxy5xxpara fallas reales, como una clave inválida o tu sistema caído. - Aplica tus restricciones a las fechas pedidas. Si una habitación no se puede reservar, devuélvela con
bookable: falseen lugar de omitirla. Si ninguna se puede reservar, respondeavailable: false. - Responde en la moneda de tu sistema. Si el huésped pidió otra, WeSpeak convierte el precio.
- El precio tiene que corresponder a la ocupación pedida, niños incluidos.
- Devuelve solo las tarifas que quieras vender por chat. El asistente ofrece todas las que vengan en
rates, y el huésped verates[].name: si dos tarifas difieren en reembolso o en forma de pago, que el nombre lo diga, por ejemplo "No reembolsable" o "Flexible, pago en el hotel". - Cada tarifa tiene que aceptar la forma de cobro que configuraste en WeSpeak Payments. Si una tarifa exige el pago total y el hotel cobra seña o pago en el hotel, la reserva va a fallar.
- Cada consulta llega en vivo. No guardamos en caché, y antes de cobrar volvemos a consultar para confirmar precio y cupo. Si una consulta falla, la repetimos.
- Responde rápido. Lo ideal es menos de 5 segundos. La prueba del panel corta a los 15.
- Responde siempre un JSON válido. Si tu endpoint falla o responde otro formato, el asistente deja de cotizar y le avisa al equipo de WeSpeak, para no darle al huésped un precio equivocado.
- Deja pasar las llamadas de WeSpeak. Si usas Cloudflare u otro firewall con bloqueo de bots, exceptúa estas rutas: WeSpeak llama desde servidores, no desde un navegador.
El contrato: reservas (POST)
Cuando el huésped confirma la reserva con WeSpeak Payments, ya sea con pago online, transferencia o pago en el hotel, WeSpeak envía la reserva a tu URL:
{
"weSpeakReservationId": "8f2c1a7e-4b1d-4c55-9a51-2f6c0d9e1b3a",
"username": "tu-hotel",
"checkinDate": "2026-11-10",
"checkoutDate": "2026-11-12",
"currency": "USD",
"currencyConversion": null,
"rooms": [
{
"name": "Doble Superior",
"code": "DBL",
"rateName": "Tarifa Flexible",
"rateCode": "FLEX",
"adults": 2,
"kids": 1,
"kidAges": [8],
"priceAmount": "300.00"
}
],
"totalPrice": 300,
"amountPaid": 90,
"amountToPay": 210,
"depositAmount": 90,
"paymentMethod": "...",
"paymentDetails": {
"orderId": "...",
"gateway": { "name": "..." }
},
"customerName": "Ana",
"customerSurname": "Pérez",
"customerEmail": "ana@example.com",
"customerPhone": "+5491100000000",
"customerCountry": "AR",
"reservationNote": "Llega tarde, cerca de las 23 h"
}
Tu endpoint responde:
{
"success": true,
"reservationId": "ABC123",
"status": "confirmed",
"message": "Reserva creada"
}
Reglas del POST:
- Cada elemento de
roomses una habitación. Una reserva de dos habitaciones trae dos elementos, cada uno con su ocupación y supriceAmount. - Ignora los campos que no uses. El cuerpo puede sumar campos nuevos con el tiempo: no rechaces la reserva por un campo que no conoces.
- Los códigos vuelven tal cual.
rooms[].name,code,rateNameyrateCodeson los que tu sistema devolvió en el GET. Si no enviaste un código, llega comonull. - El
codees el identificador. Todo lo que tu sistema necesite para reservar, por ejemplo una promoción, tiene que poder deducirse delcodede la habitación y de la tarifa. El nombre viaja como referencia. - No dupliques reservas. Si tu endpoint no responde o responde con un error HTTP, reintentamos una vez con el mismo
weSpeakReservationId. Si ese id ya existe en tu sistema, devuelve la reserva ya creada en lugar de crear otra. Un rechazo también tiene que repetirse igual, y el mismo id con datos distintos se rechaza. - Modo prueba. Si el cuerpo trae
"isTest": true, valida el formato y responde como siempre, pero no crees la reserva. Es lo que usa el botón de prueba del panel. - Descuenta el cupo en el mismo momento. Dos huéspedes pueden pagar la última habitación casi a la vez: tu sistema tiene que aceptar una sola reserva.
- Si la reserva quedó creada, responde
success: true, aunque falle algo secundario como registrar el pago en tu sistema. Ese paso lo resuelves de tu lado. - Para rechazar, responde
200consuccess: falsey unmessageque explique el motivo, por ejemplo que el precio cambió o que ya no hay cupo. La reserva queda en Reservas de WeSpeak como no sincronizada, para que tu equipo la resuelva. - Si no sabes si la reserva quedó creada, no respondas
success: true. Respondesuccess: falseexplicándolo y escríbenos a tecnologia@wespeak.pro, para revisarla antes de cargarla a mano y no duplicarla. reservationIdes el número de la reserva en tu sistema. Lo guardamos para que tu equipo la encuentre.
Montos y moneda:
rooms[].priceAmountes el total de la estadía de esa habitación, en la moneda decurrency.totalPrice,amountPaid,amountToPayydepositAmountvan en la moneda en que pagó el huésped. Si es distinta decurrency,currencyConversiontrae esa moneda y la tasa, por ejemplo{ "currency": "ARS", "conversionRate": 1450 }. Para pasar esos montos a la moneda decurrency, divídelos por la tasa.amountPaid + amountToPay = totalPrice.amountPaides lo que se cobró por chat yamountToPaylo que cobra el hotel según su política.depositAmountes la seña que pide la política, no lo cobrado.- Impuestos: la suma de
priceAmountcoincide contotalPricesi no hubo conversión y tus precios ya incluyen impuestos. Si en WeSpeak se configuran impuestos que se suman al precio,totalPricelos incluye ypriceAmountno. Lo más simple es devolver precios finales y no sumar impuestos en WeSpeak. paymentDetailstrae las referencias de la pasarela y llega vacío si no hubo cobro online. SipaymentDetails.gateway.nameesZru Token, es una garantía con tarjeta: todavía no se cobró nada, aunqueamountPaidtraiga un monto.
Antes de abrir la venta
Así validamos con los partners que ya se conectaron. Conviene empezar con las URL de tu ambiente de pruebas y una propiedad de prueba, y cambiarlas por las de producción al final:
- Disponibilidad: fechas con cupo, fechas sin cupo, con niños y para un grupo grande.
- Seguridad: una clave inválida y el
usernamede otra propiedad, que tu endpoint rechaza con401o403. - Reserva nueva, el mismo envío repetido, que debe devolver la misma reserva, y el mismo id con otros datos, que debe rechazarse.
- Precio que cambió o cupo que se agotó entre la cotización y el pago: tu sistema la rechaza con un motivo claro.
- Reserva de varias habitaciones, con pago total, con depósito y sin pago.
- Última unidad: dos reservas simultáneas, y solo una se confirma.
- Limpieza: cancela las reservas de prueba, porque ocupan cupo.
- Una reserva controlada en producción en una sola propiedad, que después cancelas, antes de abrir la venta en el resto.
Qué no hace
- No envía modificaciones ni cancelaciones. Si una reserva cambia en WeSpeak, tu equipo la actualiza en tu sistema a mano.
- No escribe precios ni disponibilidad en tu sistema. Solo los consulta y, al reservar, envía la reserva.
- No trae fotos ni descripciones. Se cargan una vez en WeSpeak, en cada habitación. Tu endpoint aporta solo lo que cambia: precio, cupo y si se puede reservar.
Errores frecuentes
| Síntoma | Causa más común | Qué hacer |
|---|---|---|
Tu endpoint responde 401 aunque la clave es correcta | Muchos hostings descartan el encabezado Authorization antes de que llegue a tu código | Lee la clave del encabezado X-API-Key, que es el que envía WeSpeak |
| La prueba pasa pero el asistente no muestra una habitación | El nombre no coincide con el de WeSpeak | Usa en rooms[].name el mismo nombre de la habitación en WeSpeak |
| Los precios salen mucho más bajos que en tu web | Tu endpoint devuelve el precio por noche | Devuelve en totalPrice el total de la estadía |
| Se crearon dos reservas iguales | Tu endpoint no deduplica | Busca el weSpeakReservationId antes de crear |
| Las reservas pagadas en otra moneda no cuadran con tu sistema | totalPrice y lo pagado vienen en la moneda de pago | Usa currencyConversion para pasarlos a tu moneda |
| Algunas tarifas fallan siempre al reservar | La tarifa exige un pago distinto del que cobra WeSpeak Payments | Alinea la política de la tarifa con la configuración de cobro, o no la devuelvas |
| El huésped ve varias tarifas con el mismo nombre | rates[].name trae el nombre de una promoción y no el del plan | Usa nombres que distingan reembolso y forma de pago |
| La prueba dice que el endpoint no respondió a tiempo | Tu sistema tarda más de 15 segundos | Optimiza la consulta o agrega caché |
| No puedes cargar la URL de reservas | Tu cuenta no tiene WeSpeak Payments | Pídele a tu asesor que lo active |
Preguntas frecuentes
¿Necesito WeSpeak Payments para cotizar?
No. Payments solo hace falta para que la reserva entre a tu sistema. Sin él, el asistente cotiza con tus precios y tu equipo carga las reservas.
¿Sirve para varias propiedades?
Sí. Cada propiedad tiene su configuración, y el parámetro username le dice a tu endpoint de qué hotel se trata.
¿Puedo usar WeSpeak Rates encima?
Sí. La disponibilidad sale de tu endpoint y las tarifas que crees en Rates se aplican encima. Para eso necesitas los code de habitación y de tarifa.
¿Qué pasa si mi sistema se cae?
El asistente deja de cotizar y avisa al equipo de WeSpeak, para no darle al huésped un precio equivocado. Cuando tu endpoint vuelve a responder, todo sigue igual.
¿Tengo que enviarles la disponibilidad o avisos de cambios?
No. Consultamos tu endpoint en vivo cada vez, y lo único que enviamos es la reserva.
¿Cómo les paso la API key?
No la envíes por correo: la cargas tú en Configuración → Integración personalizada y no vuelve a mostrarse.
¿Puedo usar HTTP o una IP interna?
No. Solo se aceptan URLs con HTTPS que se puedan alcanzar desde internet.
¿A quién le escribo si algo no funciona?
Para dudas técnicas del contrato o de tus endpoints, a nuestro equipo de desarrollo: tecnologia@wespeak.pro. Para activar la integración o WeSpeak Payments, a tu asesor.