Ir al artículo
Aniq-UI

HollinaReferencia de la API

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:

Envoltorio
{
  "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:

Terminal
curl http://localhost:8000/api/health
Respuesta
{"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:

Error
{
  "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:

Error de validación
{
  "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 como dates_taken, min_nights, capacity, cancellation_window_passed, awaiting_payment y payment_method_unavailable, y un límite rate_limited.
  • errors aparece 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 responde 403.
  • Las noches ya retenidas responden 409, un paso de reserva desde el estado equivocado 422, y una petición por encima de un límite 429.

Listas y paginación

Una lista
{ "data": [ ], "page": 1, "page_size": 6, "total": 12, "total_pages": 2 }
  • Los alojamientos, las reservas, las consultas y las reseñas se paginan con page y page_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 devuelven counts por estado.
  • Los administradores, los roles y los ajustes se paginan con page y page_count (los ajustes también aceptan page_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 400 en 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

  1. Iniciar sesión como administrador

    Terminal
    curl -X POST http://localhost:8000/api/auth/login \
      -H "Content-Type: application/json" \
      -d '{"email":"admin@hollina.example","password":"Admin@123"}'

    data.access_token es el token, con token_type Bearer y el administrador con sus roles y permisos. El token dura JWT_EXPIRATION, 7d por defecto, y expires_in informa de ese valor tal como está escrito. GET /api/auth/me devuelve al administrador con sesión iniciada con sus roles y permisos.

  2. Llama a una ruta protegida

    Terminal
    curl http://localhost:8000/api/bookings/manage -H "Authorization: Bearer YOUR_TOKEN"
  • Un correo desconocido y una contraseña incorrecta responden ambos 401 con el mismo mensaje.
  • Diez inicios de sesión fallidos desde una misma dirección en 15 minutos responden 429 hasta 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_token de la reserva como ?token=, o el correo electrónico con el que se hizo como ?email=; un par incorrecto responde 404.
MétodoRutaQuién puede llamarlaQué hace
POST/api/auth/loginCualquieraInicio de sesión del administrador: email, password
GET/api/auth/meCualquier administrador con sesión iniciadaEl 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étodoRutaQuién puede llamarlaQué hace
GET/api/staysCualquieraAlojamientos 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/featuredCualquieraLos alojamientos destacados de la página de inicio: las referencias del ajuste home_featured_references, en orden, solo los publicados
GET/api/stays/heroCualquieraEl alojamiento indicado por home_hero_stay_reference, o null
GET/api/stays/facetsCualquieraAlojamientos publicados contados por tipo y por destino, para los filtros y la página de inicio
GET/api/stays/lookupCualquieraAlojamientos publicados por id, para los alojamientos guardados: ?ids=1,2,3, 12 como máximo
GET/api/stays/:slugCualquieraUn alojamiento publicado completo, con sus fotografías, comodidades, normas de la casa y destino
GET/api/stays/:slug/similarCualquieraHasta tres alojamientos similares publicados
GET/api/stays/:slug/availabilityCualquieraLas noches ya retenidas entre from y to, 92 días como máximo
GET/api/stays/:slug/quoteCualquieracheckIn, 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/reviewsCualquieraLas reseñas publicadas del alojamiento, las más recientes primero, con su media

Destinos, preguntas y ajustes de la empresa

MétodoRutaQuién puede llamarlaQué hace
GET/api/destinationsCualquieraLos destinos marcados como visibles, en su orden
GET/api/destinations/:slugCualquieraUn destino
GET/api/faqCualquieraLas preguntas y respuestas de la página de inicio, en orden
GET/api/settings/publicCualquieraLos 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/methodsCualquieraLo 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étodoRutaQuién puede llamarlaQué hace
POST/api/bookingsCualquieraEl 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/:referenceCualquiera con el token o el correo electrónico de la reservaLa reserva del huésped, con can_cancel y can_review
POST/api/bookings/:reference/settleCualquiera con el token o el correo electrónico de la reservaLa 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/cancelCualquiera con el token o el correo electrónico de la reservaEl 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/reviewCualquiera con el token o el correo electrónico de la reservaReseñar una reserva completada, una vez: rating (de 1 a 5, se permiten medios), comment (de 10 a 2000 caracteres)
POST/api/webhooks/payments/:providerEl proveedor, por su firmastripe o paypal. Todo evento verificado responde 200; una firma incorrecta responde 401, un proveedor desconocido 404
  • Un client_token repetido devuelve el recibo de la primera reserva en lugar de hacer una segunda, y un campo company relleno se trata como un bot: la respuesta parece la misma, y no se guarda nada.
  • Un payment_method que GET /api/payments/methods no lista (PayPal con solo Stripe configurado, tarjeta con solo PayPal, pago a la llegada con su ajuste desactivado) responde 422 con payment_method_unavailable, antes de que se escriba nada.
  • Las noches se comprueban cuando se escribe la reserva: las noches retenidas responden 409 con dates_taken, y el mínimo de un alojamiento, su capacidad o un check-in pasado 422 con el motivo.
  • Un método alojado responde pending con un redirect_url a Stripe o PayPal; la reserva solo la confirma el webhook del procesador o la captura de PayPal.

Preguntas al anfitrión

MétodoRutaQuién puede llamarlaQué hace
POST/api/inquiriesCualquieraEl 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_token repetido devuelve el primer envío en lugar de guardar un segundo, y un campo company relleno 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étodoRutaQuién puede llamarlaQué hace
GET/api/stays/manageAdministradores con stays.viewTodos 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/:idAdministradores con stays.viewUn alojamiento completo
POST/api/stays/manageAdministradores con stays.createCrear 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/:idAdministradores con stays.editCambiar cualquier campo, incluida la galería (media, hasta 30 elementos)
PATCH/api/stays/manage/:id/statusAdministradores con stays.publishDefine status: draft o published. Publicar necesita tres fotografías y ambos idiomas
PUT/api/stays/manage/:id/mediaAdministradores con stays.editReemplazar la galería, en orden; la posición uno es la portada
DELETE/api/stays/manage/:idAdministradores con stays.deleteEliminar el alojamiento; se rechaza con 409 mientras exista una reserva que no esté cancelada

El calendario y las fechas bloqueadas

MétodoRutaQuién puede llamarlaQué hace
GET/api/calendarAdministradores con calendar.viewLa vista mensual: month (YYYY-MM) y, opcionalmente, stay
GET/api/availability/blocksAdministradores con calendar.viewTodos los bloqueos, el más próximo primero
POST/api/availability/blocksAdministradores con calendar.blockBloquear 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/:idAdministradores con calendar.blockCambiar un bloqueo
DELETE/api/availability/blocks/:idAdministradores con calendar.blockQuitar un bloqueo

Reservas, consultas y reseñas

MétodoRutaQuién puede llamarlaQué hace
GET/api/bookings/manageAdministradores con bookings.viewReservas. 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/:referenceAdministradores con bookings.viewUna reserva con su cronología y las acciones permitidas ahora, cada una con su motivo cuando no lo está
PATCH/api/bookings/manage/:referenceAdministradores con bookings.editaction (confirm, check_in, complete, cancel) y admin_notes. Un paso desde el estado equivocado responde 422 con su motivo
GET/api/inquiriesAdministradores con inquiries.viewConsultas. status, q, from, to, stay, page, page_size; con recuentos por estado
GET/api/inquiries/:idAdministradores con inquiries.viewUna consulta con su alojamiento
PATCH/api/inquiries/:idAdministradores con inquiries.editDefine status (new, replied, closed) y admin_notes
GET/api/reviews/manageAdministradores con reviews.viewReseñ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/:idAdministradores con reviews.moderateDefine status: published o hidden
GET/api/overviewAdministradores con overview.viewEl 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/seriesAdministradores con overview.viewReservas, ingresos y ocupación de cada uno de los últimos doce meses

Destinos, preguntas y ajustes

MétodoRutaQuién puede llamarlaQué hace
GET/api/destinations/manageAdministradores con destinations.viewTodos los destinos, incluidos los ocultos
POST/api/destinations/manageAdministradores con destinations.createAñadir uno: name, tagline y description (en, ar) y, opcionalmente, slug, cover_url, cover_alt, sort_order, is_active
PUT/api/destinations/manage/:idAdministradores con destinations.editCambiar uno
DELETE/api/destinations/manage/:idAdministradores con destinations.deleteEliminar uno; se rechaza mientras le pertenezcan alojamientos
GET/api/faq/manageAdministradores con settings.viewTodas las preguntas de la página de inicio, incluidas las ocultas
POST/api/faq/manageAdministradores con settings.editAñadir una: question y answer (en, ar) y, opcionalmente, sort_order e is_active
PUT/api/faq/manage/:idAdministradores con settings.editCambiar uno
DELETE/api/faq/manage/:idAdministradores con settings.editEliminar una
GET/api/settingsAdministradores con settings.viewTodos los ajustes. search, category, page, page_size o page_count
GET/api/settings/payments-statusAdministradores 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/:keyAdministradores con settings.viewUn ajuste por clave
PATCH/api/settings/:keyAdministradores con settings.editCambiar el value de un ajuste
DELETE/api/settings/:keyAdministradores con settings.editEliminar un ajuste

Administradores y roles

MétodoRutaQuién puede llamarlaQué hace
GET/api/adminsAdministradores con admins.viewAdministradores. email, name, phone, page, page_count
GET/api/admins/statisticsAdministradores con admins.viewRecuentos para la lista de administradores
GET/api/admins/:idAdministradores con admins.viewUn administrador, por id o nombre de usuario
POST/api/adminsAdministradores con admins.createAñadir un administrador: first_name, last_name, email, password y password_confirmation (6 caracteres o más), opcionalmente phone
PATCH/api/admins/:idAdministradores con admins.editCambiar un administrador
PATCH/api/admins/:id/rolesAdministradores con admins.assign_rolesDefinir los roles de un administrador: role_ids
DELETE/api/admins/:idAdministradores con admins.deleteEliminar un administrador
PATCH/api/admins/profileCualquier administrador con sesión iniciadaCambiar 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/passwordCualquier administrador con sesión iniciadaCambiar la propia contraseña del administrador con sesión iniciada: current_password, password, password_confirmation
GET/api/rolesAdministradores con roles.viewRoles. name, guard_name, created_from, created_to, page, page_count
GET/api/roles/statisticsAdministradores con roles.viewRecuentos para la lista de roles
GET/api/roles/selectAdministradores con roles.viewEl id y el nombre de cada rol, para un selector
GET/api/roles/permissionsAdministradores con roles.viewTodos los permisos, agrupados por área
GET/api/roles/:idAdministradores con roles.viewUn rol con sus permisos
POST/api/rolesAdministradores con roles.createAñadir un rol
PUT/api/roles/:idAdministradores con roles.editRenombrar o describir un rol
POST/api/roles/:id/permissionsAdministradores con roles.assign_permissionsAsigna los permisos de un rol
DELETE/api/roles/:idAdministradores con roles.deleteElimina un rol

Notificaciones y subidas

MétodoRutaQuién puede llamarlaQué hace
GET/api/notificationsCualquier administrador con sesión iniciadaLas 30 notificaciones más recientes del administrador con sesión iniciada
PATCH/api/notifications/read-allCualquier administrador con sesión iniciadaMarcarlas todas como leídas
PATCH/api/notifications/:id/readCualquier administrador con sesión iniciadaMarca una como leída
DELETE/api/notifications/:idCualquier administrador con sesión iniciadaElimina una
POST/api/helpers/uploadCualquier administrador con sesión iniciadaGuardar 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

RutaLímiteVariable
POST /api/auth/login10 inicios de sesión fallidos cada 15 minutosRATE_LIMIT_LOGIN
POST /api/bookings5 cada 10 minutosNinguno
POST /api/inquiries5 cada 10 minutosNinguno
POST /api/bookings/:reference/review5 cada 10 minutosNinguno

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.

¿Te atascaste en un paso?

Busca una solución antes de empezar de nuevo.

Solución de problemas

Preferencias de Cookies

Utilizamos cookies para mejorar tu experiencia de navegación, analizar el tráfico del sitio y personalizar el contenido. Al hacer clic en "Aceptar Todo", consientes nuestro uso de cookies para análisis y publicidad personalizada.