{"openapi":"3.0.0","info":{"title":"Reserva de Hamacas — API pública","description":"Endpoints públicos de consulta del widget de reservas de hamacas.\n\nPermiten leer la configuración de un establecimiento, sus zonas, la\ndisponibilidad de hamacas para una fecha y los extras contratables.\nNo requieren autenticación: son los mismos que el widget embebible llama\ndesde la web de cada cliente.\n\nCrear reservas, holds o pagos NO forma parte de esta especificación:\nesas operaciones pasan por el widget, que es donde viven el control de\nbloqueos temporales y las validaciones de negocio.\n\nTodos los endpoints tienen límite de peticiones (30/min por IP en los de\ndisponibilidad). Un 429 significa que hay que esperar, no que la\npetición fuera inválida.\n\n## Versionado (1.0.0)\n\nEstos endpoints los llama el widget embebido en la web de cada cliente,\ndesplegado fuera de nuestro control y sin actualizarse cuando nosotros\npublicamos. Por eso NO hay prefijo de versión en la ruta: moverlas\nrompería justo lo que el versionado protege.\n\nLa compatibilidad se garantiza por contrato, con semver sobre esta\nespecificación:\n\n- MAYOR: cambio incompatible. Exigiría una ruta nueva conviviendo con la\n  anterior durante toda una temporada.\n- MENOR: campos o endpoints nuevos. Ignorar lo desconocido es seguro.\n- PARCHE: correcciones que no alteran la forma de la respuesta.\n\nRecomendación para un integrador: ignora los campos que no conozcas en\nvez de validar la respuesta de forma estricta.","version":"1.0.0","contact":{"name":"Reserva de Hamacas","url":"https://reservadehamacas.com"}},"servers":[{"url":"https://api.reservadehamacas.com","description":"Producción"}],"x-api-version":"1.0.0","externalDocs":{"description":"Documentación del producto","url":"https://reservadehamacas.com"},"paths":{"/api/public/config/{clientId}":{"get":{"description":"Retorna la configuración necesaria para renderizar el widget (colores, horarios, idiomas, etc.)","operationId":"PublicController_getClientConfig","parameters":[{"name":"clientId","required":true,"in":"path","description":"ID del cliente","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Configuración del cliente obtenida exitosamente"},"403":{"description":"Dominio no autorizado para usar el widget"},"404":{"description":"Cliente no encontrado"}},"summary":"Obtener configuración pública del cliente","tags":["Public Widget"]}},"/api/public/zones/{clientId}":{"get":{"description":"Retorna todas las zonas activas del cliente con información básica (nombre, descripción, imagen del mapa)","operationId":"PublicController_getClientZones","parameters":[{"name":"clientId","required":true,"in":"path","description":"ID del cliente","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Lista de zonas obtenida exitosamente"},"404":{"description":"Cliente no encontrado"}},"summary":"Obtener zonas del cliente","tags":["Public Widget"]}},"/api/public/site/{clientSlug}":{"get":{"description":"Resuelve un cliente por su slug público y devuelve sus zonas (id, slug, name) para URLs amigables.","operationId":"PublicController_getSiteBySlug","parameters":[{"name":"clientSlug","required":true,"in":"path","description":"Slug del cliente","schema":{"example":"el-dorado-playa-sun","type":"string"}}],"responses":{"200":{"description":"Cliente y zonas resueltos"},"404":{"description":"Cliente no encontrado"}},"summary":"Resolver cliente por slug + sus zonas","tags":["Public Widget"]}},"/api/public/hamacas/{clientId}/available":{"get":{"description":"Retorna las hamacas disponibles (no reservadas) para la fecha especificada. Opcionalmente se puede filtrar por zona.","operationId":"PublicController_getAvailableHamacas","parameters":[{"name":"clientId","required":true,"in":"path","description":"ID del cliente","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}},{"name":"date","required":true,"in":"query","description":"Fecha en formato YYYY-MM-DD","schema":{"example":"2025-07-15","type":"string"}},{"name":"zoneId","required":false,"in":"query","description":"ID de la zona (opcional, para filtrar hamacas por zona)","schema":{"example":"123e4567-e89b-12d3-a456-426614174001","type":"string"}},{"name":"period","required":true,"in":"query","schema":{"type":"string"}},{"name":"sessionId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista de hamacas disponibles agrupadas por zona"},"400":{"description":"Fecha inválida"},"404":{"description":"Cliente no encontrado"}},"summary":"Obtener hamacas disponibles para una fecha","tags":["Public Widget"]}},"/api/public/hamacas/{clientId}/map":{"get":{"description":"Retorna todas las zonas con sus hamacas y posiciones para renderizar el mapa visual. Opcionalmente se puede filtrar por una zona específica.","operationId":"PublicController_getHamacasMap","parameters":[{"name":"clientId","required":true,"in":"path","description":"ID del cliente","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}},{"name":"zoneId","required":false,"in":"query","description":"ID de la zona (opcional, para obtener solo una zona)","schema":{"example":"123e4567-e89b-12d3-a456-426614174001","type":"string"}}],"responses":{"200":{"description":"Mapa de hamacas obtenido exitosamente"},"404":{"description":"Cliente no encontrado"}},"summary":"Obtener mapa de hamacas","tags":["Public Widget"]}},"/api/public/extras/{clientId}/available":{"get":{"description":"Retorna los extras disponibles para la fecha, zona y hamacas seleccionadas. Incluye información de precios, stock y si están incluidos gratis con el template.","operationId":"PublicController_getAvailableExtras","parameters":[{"name":"clientId","required":true,"in":"path","description":"ID del cliente","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}},{"name":"date","required":true,"in":"query","description":"Fecha en formato YYYY-MM-DD","schema":{"example":"2025-07-15","type":"string"}},{"name":"zoneId","required":true,"in":"query","description":"ID de la zona seleccionada","schema":{"example":"123e4567-e89b-12d3-a456-426614174001","type":"string"}},{"name":"hamacaIds","required":true,"in":"query","description":"IDs de las hamacas seleccionadas (separados por coma)","schema":{"example":"id1,id2,id3","type":"string"}}],"responses":{"200":{"description":"Lista de extras disponibles con precios y stock"},"404":{"description":"Cliente no encontrado"}},"summary":"Obtener extras disponibles para una reserva","tags":["Public Widget"]}},"/api/public/pms/{clientId}/enabled":{"get":{"description":"Retorna si el cliente tiene PMS habilitado y configurado correctamente","operationId":"PublicController_isPMSEnabled","parameters":[{"name":"clientId","required":true,"in":"path","description":"ID del cliente","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Estado de PMS"}},"summary":"Verificar si PMS está habilitado","tags":["Public Widget"]}},"/api/public/waitlist/{clientId}/enabled":{"get":{"description":"Retorna si el cliente tiene la funcionalidad de lista de espera habilitada","operationId":"PublicController_isWaitlistEnabled","parameters":[{"name":"clientId","required":true,"in":"path","description":"ID del cliente","schema":{"example":"123e4567-e89b-12d3-a456-426614174000","type":"string"}}],"responses":{"200":{"description":"Estado de la lista de espera"}},"summary":"Verificar si la lista de espera está habilitada","tags":["Public Widget"]}},"/api/public/widget/{clientId}/zones/{zoneId}/payment-methods":{"get":{"description":"Resuelve los métodos de pago aplicando jerarquía cliente→zona→queryparam. Filtra PMS_FOLIO si el PMS no está activo.","operationId":"PublicController_getZonePaymentMethods","parameters":[{"name":"clientId","required":true,"in":"path","description":"ID del cliente","schema":{"type":"string"}},{"name":"zoneId","required":true,"in":"path","description":"ID de la zona","schema":{"type":"string"}},{"name":"paymentMode","required":false,"in":"query","description":"Override de modo de pago ('pms-only' | 'card-only')","schema":{"type":"string"}}],"responses":{"200":{"description":"Lista de métodos de pago efectivos"}},"summary":"Métodos de pago efectivos para una zona (Phase 58)","tags":["Public Widget"]}}},"components":{},"tags":[{"name":"public","description":"Consulta pública de disponibilidad"}]}