Referencia de la API
Todas las rutas que sirve la API, quién puede llamarlas y cómo funcionan el inicio de sesión, los permisos, los errores, las listas, las reservas y los límites.
Para el paquete Full Stack
URL base y formato de respuesta
Todas las rutas se sirven bajo el prefijo /api. En local la URL base es http://localhost:8000/api. En un servidor es la dirección de tu API seguida de /api, el mismo valor que leen ambos frontends en NEXT_PUBLIC_API_BASE_URL (Variables de entorno). Las fotografías se sirven fuera del prefijo, en /media/….
Las rutas del sitio web son públicas; las del panel necesitan el token bearer de un administrador, y la mayoría también un permiso. Los cuerpos de las peticiones son JSON, salvo las subidas de archivos. Cada respuesta llega en el mismo sobre:
{
"success": true,
"data": { },
"message": ""
}data contiene el resultado. message es una frase corta que rellenan algunas escrituras, en el idioma de la petición, y está vacía en los demás casos. Los precios son dólares estadounidenses enteros, y las fechas son días de calendario de la empresa escritos YYYY-MM-DD.
La comprobación de estado no necesita token:
curl http://localhost:8000/api/health{"success":true,"data":{"status":"ok","database":"up"},"message":""}Cuando no se puede leer la base de datos, sigue respondiendo 200, con "status":"degraded" y "database":"down". La comprobación de estado de la imagen de Docker lee ese campo.
Errores
Un fallo conserva el envoltorio, con success: false y el estado HTTP. message es una frase en el idioma de la petición, code la clave sin traducir que hay detrás, y un rechazo que nombra algo añade en details los valores que hay detrás de su frase:
{
"success": false,
"data": null,
"message": "Booking B0021 already holds some of these nights.",
"code": "dates_taken",
"details": { "held_by": "booking", "reference": "B0021" }
}Un cuerpo que rechaza la validación lleva code: "validation_failed" y errors, con la clave de cada campo por su nombre completo:
{
"success": false,
"data": null,
"message": "guest_email must be an email",
"errors": { "guest_email": ["guest_email must be an email"] },
"code": "validation_failed"
}- Ramifica según
code, nunca según la frase, que cambia con el idioma. Los rechazos de reservas y de disponibilidad llevan códigos comodates_taken,min_nights,capacity,cancellation_window_passed,awaiting_paymentypayment_method_unavailable, y un límiterate_limited. errorsaparece en un fallo de validación, con los problemas bajo el nombre del campo tal como lo escribió la petición (check_in,guest_email). Un campo desconocido en un cuerpo se rechaza.- Una ruta protegida sin token, o con uno caducado, responde
401; un token sin el permiso responde403. - Las noches ya retenidas responden
409, un paso de reserva desde el estado equivocado422, y una petición por encima de un límite429.
Listas y paginación
{ "data": [ ], "page": 1, "page_size": 6, "total": 12, "total_pages": 2 }- Los alojamientos, las reservas, las consultas y las reseñas se paginan con
pageypage_size: 6 alojamientos por página en el sitio web (24 como máximo), 20 en el panel (50 como máximo), 10 reservas y 20 consultas (50 como máximo cada una), 8 reseñas. Las listas del panel también devuelvencountspor estado. - Los administradores, los roles y los ajustes se paginan con
pageypage_count(los ajustes también aceptanpage_size), 10 por defecto y 100 como máximo, y responden{ data, page, limit, total, totalPages }. - Los filtros de alojamientos del sitio web se validan: un valor desconocido se rechaza con
400en lugar de ignorarse, mientras que una clave que la API no lee se ignora, así que un enlace compartido con parámetros extra sigue funcionando.
Idioma
Envía Accept-Language: ar para los mensajes en árabe; cualquier otro valor responde en inglés. Los alojamientos, los destinos y las preguntas de la página de inicio llevan ambos idiomas como { "en": "…", "ar": "…" } sea cual sea la cabecera, y el cliente elige uno.
Inicio de sesión
Iniciar sesión como administrador
Terminalcurl -X POST http://localhost:8000/api/auth/login \ -H "Content-Type: application/json" \ -d '{"email":"admin@hollina.example","password":"Admin@123"}'data.access_tokenes el token, contoken_typeBearery el administrador con sus roles y permisos. El token duraJWT_EXPIRATION,7dpor defecto, yexpires_ininforma de ese valor tal como está escrito.GET /api/auth/medevuelve al administrador con sesión iniciada con sus roles y permisos.Llama a una ruta protegida
Terminalcurl http://localhost:8000/api/bookings/manage -H "Authorization: Bearer YOUR_TOKEN"
- Un correo desconocido y una contraseña incorrecta responden ambos
401con el mismo mensaje. - Diez inicios de sesión fallidos desde una misma dirección en 15 minutos responden
429hasta que el fallo más antiguo cumple 15 minutos (RATE_LIMIT_LOGIN). Los inicios de sesión correctos no cuentan. - No hay ruta de registro ni de cierre de sesión: las cuentas vienen de la carga inicial o de Gestión de administradores, y un cliente cierra la sesión olvidando su token.
- Los huéspedes no tienen cuentas. Las rutas de reserva de un huésped aceptan el
access_tokende la reserva como?token=, o el correo electrónico con el que se hizo como?email=; un par incorrecto responde404.
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/auth/login | Cualquiera | Inicio de sesión del administrador: email, password |
GET | /api/auth/me | Cualquier administrador con sesión iniciada | El administrador con sesión iniciada, sus roles y permisos |
Permisos
Las rutas del panel comprueban un permiso con el nombre <area>.<action>. Un administrador tiene todos los permisos de todos los roles que posee, y una ruta que nombra varios acepta cualquiera de ellos. Los 32 permisos y los dos roles de la carga inicial se listan en Administradores, roles y permisos.
Alojamientos en el sitio web
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/stays | Cualquiera | Alojamientos publicados. destination (slug), checkIn y checkOut (YYYY-MM-DD, ambos o ninguno: solo alojamientos libres todas las noches), guests (el mínimo que debe alojar), type (villa, apartment, cabin, chalet, loft, cottage), sort (recommended, price_asc, price_desc, rating), page, page_size |
GET | /api/stays/featured | Cualquiera | Los alojamientos destacados de la página de inicio: las referencias del ajuste home_featured_references, en orden, solo los publicados |
GET | /api/stays/hero | Cualquiera | El alojamiento indicado por home_hero_stay_reference, o null |
GET | /api/stays/facets | Cualquiera | Alojamientos publicados contados por tipo y por destino, para los filtros y la página de inicio |
GET | /api/stays/lookup | Cualquiera | Alojamientos publicados por id, para los alojamientos guardados: ?ids=1,2,3, 12 como máximo |
GET | /api/stays/:slug | Cualquiera | Un alojamiento publicado completo, con sus fotografías, comodidades, normas de la casa y destino |
GET | /api/stays/:slug/similar | Cualquiera | Hasta tres alojamientos similares publicados |
GET | /api/stays/:slug/availability | Cualquiera | Las noches ya retenidas entre from y to, 92 días como máximo |
GET | /api/stays/:slug/quote | Cualquiera | checkIn, checkOut, guests (de 1 a 50): noches, tarifa por noche, subtotal, tarifa de limpieza, total, available y el motivo del rechazo reason (past, min_nights, capacity, taken) |
GET | /api/stays/:slug/reviews | Cualquiera | Las reseñas publicadas del alojamiento, las más recientes primero, con su media |
Destinos, preguntas y ajustes de la empresa
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/destinations | Cualquiera | Los destinos marcados como visibles, en su orden |
GET | /api/destinations/:slug | Cualquiera | Un destino |
GET | /api/faq | Cualquiera | Las preguntas y respuestas de la página de inicio, en orden |
GET | /api/settings/public | Cualquiera | Los ajustes que muestra el sitio web: company_name, el eslogan y la descripción en ambos idiomas, contact_email, contact_phone, contact_address_hint, currency, timezone, las horas de check-in y check-out por defecto, allow_pay_on_arrival, cancellation_policy, home_featured_references, home_hero_stay_reference y service_email_signature |
GET | /api/payments/methods | Cualquiera | Lo que puede ofrecer el pago, por orden de prioridad: { methods: [{ method, hosted }], allowPayOnArrival, simulated }. Solo se listan los métodos de los procesadores configurados, on_arrival mientras su ajuste esté activado, y simulated es true mientras el simulador acepta tarjeta y PayPal porque no hay ningún procesador configurado |
Reservas
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/bookings | Cualquiera | El pago: stay_slug, check_in, check_out, guests, guest_first_name, guest_last_name, guest_email, payment_method (card, paypal, on_arrival), client_token (de 8 a 64 caracteres) y, opcionalmente, guest_phone, special_requests, locale (en, ar) y, solo para el simulador, card_number, card_name, card_expiry (MM/YY), card_cvc. Responde 201 con { reference, access_token, status, payment_status, payment_method, total, currency, redirect_url, failure_reason } |
GET | /api/bookings/:reference | Cualquiera con el token o el correo electrónico de la reserva | La reserva del huésped, con can_cancel y can_review |
POST | /api/bookings/:reference/settle | Cualquiera con el token o el correo electrónico de la reserva | La llama la página de retorno: captura un pedido de PayPal aprobado, y responde el estado actual de la reserva para Stripe. Se puede llamar repetidamente sin riesgo |
POST | /api/bookings/:reference/cancel | Cualquiera con el token o el correo electrónico de la reserva | El huésped cancela, mientras está pendiente o confirmada y al menos siete días antes del check-in local; después responde 422 con cancellation_window_passed |
POST | /api/bookings/:reference/review | Cualquiera con el token o el correo electrónico de la reserva | Reseñar una reserva completada, una vez: rating (de 1 a 5, se permiten medios), comment (de 10 a 2000 caracteres) |
POST | /api/webhooks/payments/:provider | El proveedor, por su firma | stripe o paypal. Todo evento verificado responde 200; una firma incorrecta responde 401, un proveedor desconocido 404 |
- Un
client_tokenrepetido devuelve el recibo de la primera reserva en lugar de hacer una segunda, y un campocompanyrelleno se trata como un bot: la respuesta parece la misma, y no se guarda nada. - Un
payment_methodqueGET /api/payments/methodsno lista (PayPal con solo Stripe configurado, tarjeta con solo PayPal, pago a la llegada con su ajuste desactivado) responde422conpayment_method_unavailable, antes de que se escriba nada. - Las noches se comprueban cuando se escribe la reserva: las noches retenidas responden
409condates_taken, y el mínimo de un alojamiento, su capacidad o un check-in pasado422con el motivo. - Un método alojado responde
pendingcon unredirect_urla Stripe o PayPal; la reserva solo la confirma el webhook del procesador o la captura de PayPal.
Preguntas al anfitrión
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/inquiries | Cualquiera | El formulario de contacto y el diálogo de preguntas de la página del alojamiento: name, email, message (de 10 a 4000 caracteres), client_token y, opcionalmente, phone, stay_slug (un alojamiento publicado), check_in, check_out, guests |
- Un
client_tokenrepetido devuelve el primer envío en lugar de guardar un segundo, y un campocompanyrelleno se trata como un bot. - Cada dirección puede enviar cinco reservas, cinco preguntas y cinco reseñas en diez minutos; la siguiente responde
429.
Gestión de alojamientos
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/stays/manage | Administradores con stays.view | Todos los alojamientos, incluidos los borradores. status, type, destination, guests, bedrooms, nights (el mínimo más largo), price (la tarifa por noche más alta), sort (updated, rate_asc, rate_desc), q, page, page_size |
GET | /api/stays/manage/:id | Administradores con stays.view | Un alojamiento completo |
POST | /api/stays/manage | Administradores con stays.create | Crear un borrador. Obligatorios: title, short_description, description y location_hint (en, ar), type, destination_id, bedrooms, beds, bathrooms, max_guests, nightly_rate, cleaning_fee, min_nights |
PUT | /api/stays/manage/:id | Administradores con stays.edit | Cambiar cualquier campo, incluida la galería (media, hasta 30 elementos) |
PATCH | /api/stays/manage/:id/status | Administradores con stays.publish | Define status: draft o published. Publicar necesita tres fotografías y ambos idiomas |
PUT | /api/stays/manage/:id/media | Administradores con stays.edit | Reemplazar la galería, en orden; la posición uno es la portada |
DELETE | /api/stays/manage/:id | Administradores con stays.delete | Eliminar el alojamiento; se rechaza con 409 mientras exista una reserva que no esté cancelada |
El calendario y las fechas bloqueadas
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/calendar | Administradores con calendar.view | La vista mensual: month (YYYY-MM) y, opcionalmente, stay |
GET | /api/availability/blocks | Administradores con calendar.view | Todos los bloqueos, el más próximo primero |
POST | /api/availability/blocks | Administradores con calendar.block | Bloquear noches: stay_id, from, to (exclusivo, como un check-out) y, opcionalmente, reason (maintenance, owner_use, other) y note. Un conflicto responde 409 con code igual a dates_taken y details: { held_by, reference }, nombrando la reserva o el bloqueo que lo impide |
PUT | /api/availability/blocks/:id | Administradores con calendar.block | Cambiar un bloqueo |
DELETE | /api/availability/blocks/:id | Administradores con calendar.block | Quitar un bloqueo |
Reservas, consultas y reseñas
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/bookings/manage | Administradores con bookings.view | Reservas. status, from y to (rango de check-in), q, stay, payment, method, guests, sort (newest, check_in, total), page, page_size; con recuentos por estado |
GET | /api/bookings/manage/:reference | Administradores con bookings.view | Una reserva con su cronología y las acciones permitidas ahora, cada una con su motivo cuando no lo está |
PATCH | /api/bookings/manage/:reference | Administradores con bookings.edit | action (confirm, check_in, complete, cancel) y admin_notes. Un paso desde el estado equivocado responde 422 con su motivo |
GET | /api/inquiries | Administradores con inquiries.view | Consultas. status, q, from, to, stay, page, page_size; con recuentos por estado |
GET | /api/inquiries/:id | Administradores con inquiries.view | Una consulta con su alojamiento |
PATCH | /api/inquiries/:id | Administradores con inquiries.edit | Define status (new, replied, closed) y admin_notes |
GET | /api/reviews/manage | Administradores con reviews.view | Reseñas. status, stay (id o slug), rating (un mínimo), q, since (7, 30, 90, 365 días), page; con recuentos |
PATCH | /api/reviews/manage/:id | Administradores con reviews.moderate | Define status: published o hidden |
GET | /api/overview | Administradores con overview.view | El resumen: las tarjetas de este mes, las llegadas y salidas de hoy, las reservas pendientes y las últimas, los alojamientos principales, los países de los huéspedes, las reservas por estado, las últimas reseñas y las consultas abiertas |
GET | /api/overview/series | Administradores con overview.view | Reservas, ingresos y ocupación de cada uno de los últimos doce meses |
Destinos, preguntas y ajustes
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/destinations/manage | Administradores con destinations.view | Todos los destinos, incluidos los ocultos |
POST | /api/destinations/manage | Administradores con destinations.create | Añadir uno: name, tagline y description (en, ar) y, opcionalmente, slug, cover_url, cover_alt, sort_order, is_active |
PUT | /api/destinations/manage/:id | Administradores con destinations.edit | Cambiar uno |
DELETE | /api/destinations/manage/:id | Administradores con destinations.delete | Eliminar uno; se rechaza mientras le pertenezcan alojamientos |
GET | /api/faq/manage | Administradores con settings.view | Todas las preguntas de la página de inicio, incluidas las ocultas |
POST | /api/faq/manage | Administradores con settings.edit | Añadir una: question y answer (en, ar) y, opcionalmente, sort_order e is_active |
PUT | /api/faq/manage/:id | Administradores con settings.edit | Cambiar uno |
DELETE | /api/faq/manage/:id | Administradores con settings.edit | Eliminar una |
GET | /api/settings | Administradores con settings.view | Todos los ajustes. search, category, page, page_size o page_count |
GET | /api/settings/payments-status | Administradores con settings.view | { stripe: { configured, testMode }, paypal: { configured, sandbox }, simulator }: si cada procesador está configurado y es de prueba o real, y si se usa el simulador, lo cual solo ocurre mientras no haya ningún procesador configurado. Nunca una clave |
GET | /api/settings/:key | Administradores con settings.view | Un ajuste por clave |
PATCH | /api/settings/:key | Administradores con settings.edit | Cambiar el value de un ajuste |
DELETE | /api/settings/:key | Administradores con settings.edit | Eliminar un ajuste |
Administradores y roles
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/admins | Administradores con admins.view | Administradores. email, name, phone, page, page_count |
GET | /api/admins/statistics | Administradores con admins.view | Recuentos para la lista de administradores |
GET | /api/admins/:id | Administradores con admins.view | Un administrador, por id o nombre de usuario |
POST | /api/admins | Administradores con admins.create | Añadir un administrador: first_name, last_name, email, password y password_confirmation (6 caracteres o más), opcionalmente phone |
PATCH | /api/admins/:id | Administradores con admins.edit | Cambiar un administrador |
PATCH | /api/admins/:id/roles | Administradores con admins.assign_roles | Definir los roles de un administrador: role_ids |
DELETE | /api/admins/:id | Administradores con admins.delete | Eliminar un administrador |
PATCH | /api/admins/profile | Cualquier administrador con sesión iniciada | Cambiar el first_name, last_name, email, phone o profile_picture del propio administrador con sesión iniciada. La contraseña tiene su propia ruta |
PATCH | /api/admins/profile/password | Cualquier administrador con sesión iniciada | Cambiar la propia contraseña del administrador con sesión iniciada: current_password, password, password_confirmation |
GET | /api/roles | Administradores con roles.view | Roles. name, guard_name, created_from, created_to, page, page_count |
GET | /api/roles/statistics | Administradores con roles.view | Recuentos para la lista de roles |
GET | /api/roles/select | Administradores con roles.view | El id y el nombre de cada rol, para un selector |
GET | /api/roles/permissions | Administradores con roles.view | Todos los permisos, agrupados por área |
GET | /api/roles/:id | Administradores con roles.view | Un rol con sus permisos |
POST | /api/roles | Administradores con roles.create | Añadir un rol |
PUT | /api/roles/:id | Administradores con roles.edit | Renombrar o describir un rol |
POST | /api/roles/:id/permissions | Administradores con roles.assign_permissions | Asigna los permisos de un rol |
DELETE | /api/roles/:id | Administradores con roles.delete | Elimina un rol |
Notificaciones y subidas
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/notifications | Cualquier administrador con sesión iniciada | Las 30 notificaciones más recientes del administrador con sesión iniciada |
PATCH | /api/notifications/read-all | Cualquier administrador con sesión iniciada | Marcarlas todas como leídas |
PATCH | /api/notifications/:id/read | Cualquier administrador con sesión iniciada | Marca una como leída |
DELETE | /api/notifications/:id | Cualquier administrador con sesión iniciada | Elimina una |
POST | /api/helpers/upload | Cualquier administrador con sesión iniciada | Guardar un archivo (multipart file, con path para la carpeta, for para el tamaño predefinido como stay, cover o profile, y type). Las fotografías se recodifican como JPEG, de 1920 píxeles de ancho como máximo; los vídeos se aceptan como MP4, WebM, MOV o M4V; 150 MB como máximo. Responde con las direcciones del archivo guardado |
Una subida no tiene permiso propio: en qué se convierte el archivo lo comprueba la ruta que lo guarda. Las notificaciones se conservan 30 días.
Límites por dirección
| Ruta | Límite | Variable |
|---|---|---|
POST /api/auth/login | 10 inicios de sesión fallidos cada 15 minutos | RATE_LIMIT_LOGIN |
POST /api/bookings | 5 cada 10 minutos | Ninguno |
POST /api/inquiries | 5 cada 10 minutos | Ninguno |
POST /api/bookings/:reference/review | 5 cada 10 minutos | Ninguno |
Una petición que supera un límite responde 429. Las cuentas están en la memoria de la API, así que un reinicio las borra. Detrás de un proxy inverso, define TRUST_PROXY para que cada visitante se cuente en su propia dirección.
El asistente de IA y sus conversaciones
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
La ruta de streaming del asistente, su lista de modelos y las conversaciones guardadas.
Servidor MCP
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
El endpoint MCP para agentes de programación y cómo se autoriza.
Actualizaciones en directo por WebSocket
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Los namespaces de Socket.IO que escucha el panel, sus eventos y cómo se autoriza una conexión.
Rutas del modo demostración
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Las rutas que existen solo para una compilación de demostración pública.