Kaza Living · Integración

API de disponibilidad y reservas

Documentación para el bot de WhatsApp de Lezat. Permite consultar disponibilidad y precios en tiempo real, y generar enlaces de reserva con los datos del huésped ya cargados.

Cómo empezar

Todas las llamadas van por HTTPS a esta dirección:

https://pbcxolfixmhkoxhxylnb.supabase.co/functions/v1/partner-api

Autenticación

Cada petición debe incluir la llave en el header X-API-Key. La llave se les entrega por separado, no aparece en este documento.

X-API-Key: kz_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

La llave identifica a Lezat y define a qué puede acceder. Si en algún momento creen que se expuso, avísennos y la reemplazamos: revocar y emitir una nueva toma un minuto.

Formato

Las respuestas son JSON. Las fechas van como AAAA-MM-DD y los precios en pesos colombianos, sin decimales.

Consultar disponibilidad

Devuelve las suites que se pueden vender en esas fechas, con su precio y un enlace de reserva listo para enviar. Consulta el estado real del sistema en el momento de la llamada.

GET /disponibilidad

Parámetros

ParámetroTipoDescripción
modalidad texto noche (por defecto), 3h, 6h o 12h. Con un paquete por horas se usan fecha y hora_inicio en lugar de checkin y checkout.
checkin · fecha Día de entrada. Obligatorio por noche.
checkout · fecha Día de salida. Obligatorio por noche, y posterior a la entrada.
fecha fecha Día del paquete. Obligatorio cuando la modalidad es por horas.
hora_inicio texto Hora de entrada en formato HH:MM de 24 horas. Obligatorio cuando la modalidad es por horas. La salida se calcula sola y puede caer al día siguiente.
sede texto calle-100 o usaquen. Si se omite, devuelve las dos sedes.
huespedes entero Número de personas. Si se envía, se excluyen las suites que no las admiten.

Ejemplo

curl "https://pbcxolfixmhkoxhxylnb.supabase.co/functions/v1/partner-api/disponibilidad\
?checkin=2026-09-15&checkout=2026-09-17&sede=calle-100&huespedes=2" \
  -H "X-API-Key: SU_LLAVE"

Respuesta

{
  "consulta": {
    "checkin": "2026-09-15",
    "checkout": "2026-09-17",
    "noches": 2,
    "sede": "Calle 100",
    "huespedes": 2
  },
  "moneda": "COP",
  "impuestos": {
    "iva_pct": 19,
    "incluido_en_los_precios": true,
    "nota": "Los precios de esta respuesta ya incluyen IVA del 19%..."
  },
  "suites": [
    {
      "id": "9d3e6dd5-7b4e-4bfa-b5fa-022b771123b1",
      "nombre": "Suite Star",
      "sede": "Calle 100",
      "descripcion": "Ideal para negocios y familias...",
      "capacidad_maxima": 4,
      "unidades_libres": 3,
      "disponible": true,
      "precio_noche_desde": 259900,
      "precio_total": 519800,
      "precio": {
        "subtotal": 436806,
        "iva": 82994,
        "total": 519800,
        "iva_pct": 19
      },
      "tiene_oferta": false,
      "foto": "https://.../calle100-suite-star.jpeg",
      "enlace_reserva": "https://reservas.kazalivingbog.com/?sede=calle-100&checkin=..."
    }
  ]
}
CampoSignificado
unidades_libresCuántas suites de ese tipo quedan disponibles.
disponiblefalse cuando está agotada. Las agotadas se devuelven igual, al final de la lista.
precio_noche_desdeLa noche más económica del rango, con IVA. Puede variar entre noches si hay una oferta parcial.
precio_totalEl total de la estancia con IVA. Es el número que conviene decirle al cliente: es exactamente lo que va a cobrar la pasarela.
precioEl desglose del total: subtotal (sin IVA), iva y total. subtotal + iva siempre da total, sin diferencias de redondeo. Cuando la consulta trae huespedes mayor a 2, incluye además huespedes_adicionales y recargo_huespedes, que ya vienen sumados en el subtotal.
fotoURL pública de la foto principal, entre 200 y 340 KB.
fotosLa galería completa, en el orden en que conviene mostrarla. Siempre es una lista, aunque la suite tenga una sola foto.
enlace_reservaEnlace que abre esa suite con las fechas puestas. Sirve cuando aún no tienen los datos del cliente.

Paquetes por horas

Kaza vende paquetes de 3, 6 y 12 horas en Habitación Ejecutiva y Suite Standard de Calle 100. Se consultan por la misma ruta, con modalidad, fecha y hora_inicio. La respuesta tiene la misma forma; el precio del paquete viene en precio_total y precio_noche_desde llega en null, porque no aplica.

GET /disponibilidad?modalidad=6h&fecha=2026-09-25&hora_inicio=14:00
{
  "consulta": {
    "modalidad": "6h",
    "checkin": "2026-09-25",
    "checkout": "2026-09-25",
    "noches": null,
    "hora_inicio": "14:00",
    "hora_fin": "20:00",
    "sede": null,
    "huespedes": null
  },
  "moneda": "COP",
  "suites": [ ... ]
}

Si el paquete cruza la medianoche, checkout es el día siguiente: un paquete de 12 horas que empieza a las 20:00 termina a las 08:00 del otro día. Las suites que no se venden por horas simplemente no aparecen en la respuesta.

Estadías largas

Esta ruta devuelve tarifa de lista, y Kaza no vende así las estadías largas: las negocia. De 14 noches en adelante el precio que acuerda un asesor suele quedar bastante por debajo del que ve aquí, así que cotizar con estos valores sería pedir más de lo que cobraría Kaza. Cuando la consulta entra en ese rango, la respuesta incluye:

{
  "aviso_estadia_larga": {
    "escalar_a_asesor": true,
    "instruccion": "Kaza Living negocia las estadías de 14 noches o más...",
    "sugerencia_para_el_huesped": "Para estadías de dos semanas o más manejamos
      tarifas especiales, mejores que la publicada. Te comunico con un asesor..."
  }
}

Los dos textos tienen destinatarios distintos. instruccion está dirigido al bot y no conviene repetírselo al huésped: está en imperativo y sonaría raro leído en voz alta. sugerencia_para_el_huesped sí se puede usar tal cual, o adaptarlo al tono de la conversación.

Cuando venga este aviso, lo recomendable es no cotizar ni generar enlace y pasar la conversación a un asesor.

Crear el enlace con los datos del huésped

Cuando ya tienen los datos del cliente, este endpoint los recibe y devuelve un enlace personalizado. El cliente solo tiene que revisar, confirmar y pagar.

Los datos personales no viajan en la URL. Un enlace queda en el historial del navegador y se reenvía por WhatsApp, así que poner la cédula o el teléfono ahí los expondría. En su lugar el enlace lleva un código que los representa, se canjea una sola vez y vence.

POST /pre-reserva

Cuerpo

CampoTipoDescripción
modalidadtextonoche (por defecto), 3h, 6h o 12h.
checkin ·fechaDía de entrada. Obligatorio por noche.
checkout ·fechaDía de salida. Obligatorio por noche.
fechafechaDía del paquete. Obligatorio cuando la modalidad es por horas.
hora_iniciotextoHora de entrada HH:MM. Obligatorio cuando la modalidad es por horas.
huesped.nombre ·textoÚnico dato obligatorio del huésped.
suite_idtextoEl id que devolvió la consulta de disponibilidad. Si se envía, el enlace abre esa suite directamente.
sedetextocalle-100 o usaquen. Se deduce sola si mandan suite_id.
huespedesenteroNúmero de personas.
huesped.tipo_documentotextoCC, CE, PA o NIT.
huesped.documentotextoNúmero de documento.
huesped.emailtextoCorreo del huésped.
huesped.telefonotextoTeléfono del huésped.
huesped.nacionalidadtextoEj. Colombiana.

Los campos marcados con · son obligatorios. Entre más datos envíen, menos tiene que llenar el cliente.

Ejemplo

curl -X POST "https://pbcxolfixmhkoxhxylnb.supabase.co/functions/v1/partner-api/pre-reserva" \
  -H "X-API-Key: SU_LLAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "checkin": "2026-09-15",
    "checkout": "2026-09-17",
    "suite_id": "9d3e6dd5-7b4e-4bfa-b5fa-022b771123b1",
    "huespedes": 3,
    "huesped": {
      "nombre": "María Restrepo",
      "tipo_documento": "CC",
      "documento": "1020304050",
      "email": "maria@ejemplo.com",
      "telefono": "3001234567",
      "nacionalidad": "Colombiana"
    }
  }'

Respuesta

{
  "codigo": "c77ea832ec9246879594f2c1141c91fc",
  "enlace": "https://reservas.kazalivingbog.com/?pre=c77ea832...&suite=9d3e6dd5...",
  "expira_at": "2026-09-01T15:30:00.000Z",
  "vigencia_horas": 2,
  "aviso": "El enlace vence en 2 horas..."
}

El campo enlace es lo que se le manda al cliente por el chat.

Cómo funciona el enlace

Al abrirlo, el cliente encuentra el formulario de reserva con todo puesto:

  • Las fechas y el número de personas que cotizaron.
  • La suite que eligieron, ya abierta, si enviaron suite_id.
  • Sus datos personales, si los enviaron.

Solo le queda revisar y pagar. El pago se procesa con PayU dentro de nuestra plataforma, y al confirmarse la reserva entra automáticamente al sistema de Kaza Living y el huésped recibe su correo de confirmación.

Si no envían suite_id, el enlace muestra las suites disponibles para esas fechas y el cliente escoge. Es útil cuando todavía está comparando.

Qué pasa si el enlace vence

El enlace tiene 2 horas de vigencia. No es una restricción arbitraria: entre que ustedes cotizan y el cliente paga pueden pasar horas, y en ese tiempo la suite puede venderse por otro canal.

Dentro de esas 2 horas el cliente puede abrirlo las veces que necesite y sus datos siguen precargados. Si empieza el pago y lo abandona, puede volver al mismo enlace y retomar donde iba. El enlace se cierra únicamente cuando el pago queda aprobado.

Pasadas las 2 horas, al abrirlo el cliente ve un aviso que le explica que sus datos no quedaron cargados y que puede reservar igual llenando el formulario. No se queda sin entender qué pasó.

Cómo regenerar un enlace vencido. No hace falta nada especial: se vuelve a llamar POST /pre-reserva con los mismos datos del huésped y se recibe un código nuevo con sus 2 horas. Conviene consultar disponibilidad antes, por si la suite ya se vendió.

También vale la pena que el bot no prometa una suite como asegurada: hasta que no se paga, no está reservada. La disponibilidad se revalida en el momento del pago, así que si la suite se vendió antes, el sistema lo bloquea en vez de generar una sobreventa.

Errores

Los errores llegan con el código HTTP correspondiente y un cuerpo con el detalle:

{ "error": "Se requieren 'checkin' y 'checkout' en formato AAAA-MM-DD" }
CódigoQué significa
400Falta un dato o llegó mal. El mensaje dice cuál.
401Falta la llave o no es válida.
403La llave es válida pero no tiene permiso para esa operación.
404La ruta no existe. Revisar la dirección.
500Error de nuestro lado. Si se repite, avísennos con la hora aproximada: registramos cada petición y podemos rastrearla.

Notas

Precios

Los valores que devuelve la API son los que ve el cliente en la plataforma. Todos los precios de la respuesta incluyen IVA del 19%, y el desglose viene aparte en precio. El total es exactamente lo que cobra la pasarela al pagar.

La excepción: el alojamiento es exento de IVA para huéspedes extranjeros y para estadías mensuales. En esos casos el valor a pagar es el subtotal, no el total. Como la nacionalidad se captura al reservar y no al cotizar, lo recomendable es cotizar con el total y aclarar que si el huésped es extranjero el alojamiento queda exento.

Huéspedes adicionales

La tarifa cubre hasta 2 personas. A partir de la tercera se cobra un recargo por persona: por cada noche en estadías por noche, y una sola vez en los paquetes por horas.

No hay que calcularlo: si la consulta incluye huespedes, el recargo ya viene sumado en precio_total y discriminado en precio.recargo_huespedes. Es el mismo valor que cobra la página de pago, así que lo que cotice el bot y lo que pague el huésped coinciden.

Si huespedes no se envía, el precio se calcula para 2 personas. Las suites cuya capacidad sea menor al número consultado no aparecen en la respuesta.

Fotos

Cada suite trae foto con la imagen principal y fotos con la galería completa, en el orden en que conviene mostrarla: se entra, se ve el espacio, después el detalle. fotos siempre es una lista, aunque la suite tenga una sola imagen, para que no haya que manejar dos casos distintos.

Son URLs públicas, sin autenticación, entre 200 y 340 KB cada una — tamaño cómodo para enviarlas por WhatsApp. Salen directo del sistema, así que cuando Kaza cambie o agregue fotos el bot las toma sin que haya que tocar nada.

Hoy tienen galería la Habitación Arena y la Suite Tierra de Usaquén y la Suite Star de Calle 100. Las demás traen su foto principal mientras se cargan las suyas.

Pruebas

Pueden probar directamente contra esta dirección. Consultar disponibilidad no modifica nada, y una pre-reserva solo guarda los datos para el enlace: no bloquea inventario ni crea una reserva. La reserva se crea únicamente cuando el cliente paga.

Dudas

Cualquier cosa que necesiten y no esté acá, escríbannos. Si el bot requiere un dato adicional en la respuesta, se puede agregar.