PMS · Sistema de Gestión de Propiedades Hoteleras
API REST · V1 — OpenAPI 3.0 — Bearer Token (operadores de hotel) — API Key (integraciones externas)
Toda esta API vive bajo /api/v1, y expone dos formas de autenticación según quién
consume el endpoint. Si eres un operador de hotel, autentícate con OTP para obtener
un Bearer token. Si eres una integración externa, autentícate con una API Key en el
header X-Api-Key — no necesitas Bearer token. Para registrar consumos, además
envía el token de tu socio de consumo en el header X-Api-Token. El detalle
completo de ambos mecanismos está en el documento de Autenticación y Sesiones.
Visión general
Hoy la API permite:
- Autenticarse como operador de hotel, listar/filtrar las reservas de su
establecimiento y crear reservas nuevas. - Consultar un hotel por su número de documento y las reservas activas de un
huésped, y registrar consumos externos (ej. restaurante/bar) sobre esa reserva,
para integraciones de punto de venta. - Registrar y actualizar los socios de consumo (ej. un restaurante o bar)
autorizados a cargar consumos a las reservas de un hotel. - Recibir eventos de reserva desde channel managers/OTAs y notificaciones de
facturación electrónica (integraciones entrantes).
Glosario del dominio
| Término | Definición |
|---|---|
| Hotel | Establecimiento hotelero, unidad sobre la que operan las reservas. |
| Reserva | Estadía de un huésped en un hotel, con fecha de check-in/check-out. |
| Stage | Etapa operacional de una reserva: confirm_registered (confirmada, sin check-in), checkin_registered (huésped hospedado), checkout_registered (estadía finalizada). |
| Pre-reserva / Post-reserva | Filtros sobre si el check-in de la reserva ya pasó o está por venir. |
| Habitación | Unidad física del hotel asignada a una reserva. |
| Tipo de habitación | Categoría de habitación del hotel (ej. Doble). Al crear una reserva se pide por room_type_id y el PMS asigna la habitación. |
| Huésped | Persona hospedada, identificada por su número de documento. |
| Documento del hotel | Número de documento (ej. NIT) de la persona natural o jurídica dueña del hotel. Se usa para resolver el hotel_id. |
| Consumo externo | Cargo (ej. restaurante/bar) que un sistema externo registra sobre la reserva activa de un huésped. |
| Cuenta por cobrar | Estado (pending) en el que queda un consumo externo registrado hasta que recepción lo cobra manualmente al huésped. |
| Socio de consumo | Proveedor externo (ej. restaurante o bar) autorizado a registrar consumos para las reservas de un hotel. Su Token se envía en el header X-Api-Token al registrar un consumo. Solo los socios activos pueden registrar consumos; la activación se gestiona desde el PMS. |
Autenticación
Dos mecanismos, según quién consume la API:
- Bearer token (OTP) — operadores de hotel.
- API Key (
X-Api-Key) — integraciones externas (Consumos Externos y Socios
de Consumo).- Al registrar un consumo (
POST /api/v1/external_consumptions) se envía además
el headerX-Api-Tokencon elTokendel socio de consumo, que retorna el
registro del socio.
- Al registrar un consumo (
El flujo completo, ejemplos de request/response y límites de cada uno están en el
documento Autenticación y Sesiones.
Entornos y URLs base
| Entorno | URL | Descripción |
|---|---|---|
| Producción | https://aos.ayenda.co | Entorno real. |
| Staging | http://staging-aos.ayenda.co | Entorno de pruebas. Sin TLS — usar solo HTTP. |
Convenciones
Estándar de respuestas Index (paginación)
Todos los endpoints de listado retornan la paginación en los headers de la
respuesta y los datos en el body bajo la llave data. Los filtros aplicados
se reflejan en filters.
Headers de respuesta:
Current-Page: 1
Page-Limit: 20
Total-Count: 150
Total-Pages: 8
| Header | Tipo | Descripción |
|---|---|---|
Current-Page | integer | Número de la página actual. |
Page-Limit | integer | Cantidad máxima de elementos por página. |
Total-Count | integer | Total de registros disponibles. |
Total-Pages | integer | Total de páginas disponibles. |
Body de respuesta:
{
"data": [
{ "id": 1001, "status": "active" }
],
"filters": {
"stage": "checkin_registered",
"pre_reservations": false,
"post_reservations": false
}
}Fechas
Formato YYYY-MM-DD para fechas, ISO 8601 (2024-03-15T14:30:00.000Z) para
timestamps.
Filtrado
Los parámetros de filtro se envían como query params planos (ej. stage,
pre_reservations) o anidados con la notación campo[subcampo] para rangos (ej.
search_all_date_fields[start_date]). Los filtros aplicados se reflejan de vuelta
en la llave filters de la respuesta — ver ejemplo de paginación arriba.
Moneda
Cada hotel tiene su propia moneda configurada (ej. COP, MXN, PEN — el PMS opera
hoteles en varios países). Los montos numéricos (ej. amount en Consumos
Externos) no incluyen un código de moneda en la respuesta ni en el request —
se asume la moneda configurada del hotel correspondiente, que hoy no se expone vía
API. Si integras con hoteles en más de un país, confirma la moneda de cada hotel
por fuera de la API con tu contacto de integración.
Manejo de errores
Los endpoints de error retornan un objeto errors con la misma estructura. El
campo details es opcional y solo aparece cuando hay información adicional
relevante.
Sin detalles adicionales:
{ "errors": { "code": "unauthorized", "title": "Phone is blocked" } }Con detalles adicionales:
{
"errors": {
"code": "too_many_requests",
"title": "Login attempt limit exceeded",
"details": "Maximum 5 attempts per hour. Try again later."
}
}| Campo | Tipo | Obligatorio | Descripción |
|---|---|---|---|
code | string | Sí | Identificador del error. |
title | string | Sí | Descripción legible del error. |
details | string | No | Información adicional para diagnosticar el problema. |
Catálogo de códigos
| Código | Estado | Significado |
|---|---|---|
200 | OK | La solicitud fue exitosa y la respuesta contiene datos. |
201 | Created | El recurso fue creado exitosamente. |
204 | No Content | La solicitud fue exitosa pero no hay datos que retornar. |
400 | Bad Request | Falta un parámetro requerido o la solicitud está mal formada. |
401 | Unauthorized | El token/API Key es inválido, el teléfono está bloqueado, o el X-Api-Token falta, no existe o pertenece a un socio inactivo. |
404 | Not Found | El recurso solicitado no existe. |
422 | Unprocessable Entity | Los parámetros enviados son inválidos o están mal formados. |
429 | Too Many Requests | Se superó el límite de intentos de inicio de sesión (5 por hora). |
500 | Internal Server Error | Error inesperado durante el procesamiento. |
503 | Service Unavailable | El proveedor de OTP (SMS/WhatsApp) falló. |
Versionado y changelog
La API está en v1, estable. Cualquier cambio que rompa compatibilidad se
comunicará con anticipación antes de aplicarse y queda marcado como
incompatible en el changelog.
Changelog:
| Fecha | Cambio |
|---|---|
| 2026-09-28 | Nuevo módulo Socios de Consumo: registrar (POST /api/v1/hotel_consumption_partners) y actualizar (PATCH /api/v1/hotel_consumption_partners/{id}) socios de consumo. |
| 2026-09-28 | Incompatible: POST /api/v1/external_consumptions ahora exige el header X-Api-Token (token del socio de consumo), además de X-Api-Key. |
| 2026-08-26 | Nuevo endpoint Crear una reserva de hotel (POST /api/v1/hotels/{hotel_id}/reservations) en Reservas. |
| 2026-08-10 | Nuevo endpoint Consultar hotel por número de documento (GET /api/v1/hotels/find_by) en Consumos Externos. |
| 2026-08-03 | GET /api/v1/reservations/find_by ahora busca solo por hotel_id + identification_number (ya no requiere room_name) y retorna todas las reservas activas del huésped. |
| 2026-07-24 | Documento inicial para integradores externos. |
Referencia de API (consumible)
| Módulo | Endpoint | Descripción | Autenticación |
|---|---|---|---|
| Autenticación y Sesiones | POST /api/v1/sessions/send_otp | Enviar OTP por SMS y WhatsApp | Ninguna |
POST /api/v1/sessions | Iniciar sesión con OTP | Ninguna | |
DELETE /api/v1/sessions | Cerrar sesión | Bearer token | |
| Reservas | GET /api/v1/hotels/reservations | Listar y filtrar reservas del hotel | Bearer token |
POST /api/v1/hotels/{hotel_id}/reservations | Crear una reserva de hotel | Bearer token | |
| Consumos Externos | GET /api/v1/hotels/find_by | Consultar hotel por número de documento | API Key |
GET /api/v1/reservations/find_by | Consultar reservas activas del huésped por documento | API Key | |
POST /api/v1/external_consumptions | Registrar consumo del huésped | API Key + X-Api-Token | |
| Socios de Consumo | POST /api/v1/hotel_consumption_partners | Registrar un socio de consumo | API Key |
PATCH /api/v1/hotel_consumption_partners/{id} | Actualizar un socio de consumo | API Key |
Próximamente: Huéspedes, Habitaciones y Disponibilidad, Tarifas, Housekeeping.
Integraciones entrantes (webhooks)
Estos endpoints los invoca el sistema externo, no el integrador — la plataforma los
expone para recibir sus eventos.
| Módulo | Descripción |
|---|---|
| Connectivity Checks | Health check y diagnóstico de conectividad |