Referencia de la API
Cada ruta que sirve la API, quién puede llamarla, y cómo funcionan el inicio de sesión, los permisos, los errores, las listas y los límites.
Para el paquete Full Stack
URL base y formato de respuesta
Cada ruta se sirve 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 ambos frontends leen de NEXT_PUBLIC_API_BASE_URL (Variables de entorno). Las fotos 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 breve que rellenan algunas escrituras, en el idioma de la petición, y está vacío en los demás casos. Los precios son números decimales en la moneda de la propiedad.
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 mantiene el envoltorio, con success: false y el estado HTTP:
{
"success": false,
"data": null,
"message": "…",
"errors": { "email": ["…"] }
}messagees una frase en el idioma de la petición.errorsaparece en un fallo de validación, con los problemas por campo, indexados por la ruta que envió el cliente (comotitle.en). 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. - Una petición que supera un límite responde
429.
Listas y paginación
{ "data": [ ], "page": 1, "limit": 12, "total": 15, "totalPages": 2 }- Las propiedades, consultas y visitas se paginan con
pageypage_size: 12 por página por defecto en el sitio web (como máximo 24), 10 en el panel (como máximo 50). Las listas del panel también devuelven sus recuentos por estado. - Los administradores, roles y ajustes se paginan con
pageypage_count. - Salvo que la ruta tenga su propio orden, las filas llegan con la actualizada más recientemente primero, con el id como desempate, así que la paginación es estable.
- Los filtros de propiedades 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 mensajes en árabe; cualquier otro valor responde en inglés. Las propiedades y los barrios llevan ambos idiomas como { "en": "…", "ar": "…" } diga lo que diga 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@velra.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/leads -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.
| 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 llamado <area>.<action>. Un administrador tiene todos los permisos de todos sus roles, y una ruta que nombra varios acepta cualquiera de ellos. Los 31 permisos y los dos roles de la carga inicial se listan en Administradores, roles y permisos.
Propiedades en el sitio web
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/properties | Cualquiera | Viviendas publicadas. purpose (sale, rent), type (apartment, villa, townhouse), neighborhood (slug), min_price, max_price, bedrooms (0 para estudios, si no un mínimo), amenities (slugs separados por comas, todos obligatorios), q (título o referencia), sort (newest, price_asc, price_desc), page, page_size |
GET | /api/properties/featured | Cualquiera | Las viviendas destacadas de la página de inicio: las referencias del ajuste home_featured_references, en orden, o las viviendas publicadas marcadas como destacadas cuando ninguna de ellas está publicada |
GET | /api/properties/facets | Cualquiera | Viviendas publicadas contadas por finalidad, por tipo y por barrio, para los filtros y la página de inicio |
GET | /api/properties/lookup | Cualquiera | Viviendas publicadas por id, para viviendas guardadas y comparar: ?ids=1,2,3, como máximo 12 |
GET | /api/properties/:slug/similar | Cualquiera | Hasta tres viviendas similares publicadas |
GET | /api/properties/:slug | Cualquiera | Una vivienda publicada completa, con su galería, su barrio y su estancia amueblada pública |
Barrios y ajustes de la agencia
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/neighborhoods | Cualquiera | Los barrios marcados como visibles, en su orden |
GET | /api/settings/public | Cualquiera | Los ajustes que renderiza el sitio web: agency_name, los eslóganes y descripciones en ambos idiomas, contact_email, agency_city, currency, timezone, home_featured_references y home_staging_property_slug |
El formulario de contacto y las solicitudes de visita
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
POST | /api/leads | Cualquiera | El formulario de contacto: name, email, intent (buy, rent, other), client_token (un UUID v4) y, opcionalmente, phone, preferred_areas (slugs), budget, message (1000 caracteres), property_id. Responde 201 con { id, received_at } |
POST | /api/viewings | Cualquiera | Una solicitud de visita: property_id (una vivienda publicada), name, email, preferred_date (YYYY-MM-DD), preferred_time (HH:MM, hora de la agencia), client_token y, opcionalmente, phone, message. Responde 201 con { reference, status, preferred_at, timezone } |
- Un
client_tokenrepetido devuelve el recibo del primer envío en lugar de guardar un segundo. - Un campo
companyrellenado se trata como un bot: la respuesta es igual y no se guarda nada. - Una visita debe empezar con al menos una hora de antelación, en hora de
Asia/Dubai; antes responde400conpreferred_time_too_soonenpreferred_at. - Cada dirección puede enviar cinco de cada en diez minutos; la siguiente responde
429.
Gestionar propiedades
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/properties/manage | Administradores con properties.view | Todas las propiedades, borradores incluidos. purpose, type, status, q, page, page_size; devuelve counts de todas, publicadas y borradores |
GET | /api/properties/manage/:id | Administradores con properties.view | Una propiedad completa, con su galería y sus pares de amueblado |
POST | /api/properties/manage | Administradores con properties.create | Crear un borrador. Obligatorios: title (en, ar), purpose, type, price, bedrooms, bathrooms, area_sqm |
PUT | /api/properties/manage/:id | Administradores con properties.edit | Cambiar cualquier campo, la galería incluida (media, hasta 40 elementos) |
PATCH | /api/properties/manage/:id/status | Administradores con properties.publish | Definir status: draft, published, sold, rented o archived |
PUT | /api/properties/manage/:id/media | Administradores con properties.edit | Reemplazar la galería, en orden, con un elemento marcado como is_cover |
DELETE | /api/properties/manage/:id | Administradores con properties.delete | Eliminar la propiedad |
Consultas y visitas
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/leads | Administradores con leads.view | Consultas. status, q, received_within_days, page, page_size; con recuentos por estado |
GET | /api/leads/:id | Administradores con leads.view | Una consulta con su propiedad, notas y visita |
PATCH | /api/leads/:id | Administradores con leads.edit | Definir status (new, contacted, qualified, closed) y notes |
GET | /api/viewings | Administradores con viewings.view | Visitas. status, q, scheduled_from, scheduled_to, page, page_size; con recuentos por estado |
GET | /api/viewings/:id | Administradores con viewings.view | Una visita con su consulta y propiedad |
PATCH | /api/viewings/:id | Administradores con viewings.edit | action (confirm, complete, cancel), confirmed_at (ISO 8601) y admin_notes. Una acción desde el estado equivocado responde 400 |
GET | /api/overview | Administradores con overview.view | El resumen: recuentos de publicadas, consultas nuevas, visitas pendientes de confirmación y próximas, filas recientes, viviendas destacadas y los puntos del mapa |
Barrios y ajustes
| Método | Ruta | Quién puede llamarla | Qué hace |
|---|---|---|---|
GET | /api/neighborhoods/manage | Administradores con neighborhoods.view | Todos los barrios, los ocultos incluidos |
POST | /api/neighborhoods/manage | Administradores con neighborhoods.create | Añadir uno: name (en, ar) y, opcionalmente, slug, short_description, city, is_featured, sort_order, is_active, cover_url, cover_alt |
PUT | /api/neighborhoods/manage/:id | Administradores con neighborhoods.edit | Cambiar uno |
DELETE | /api/neighborhoods/manage/:id | Administradores con neighborhoods.delete | Eliminar uno; sus viviendas siguen existiendo sin barrio |
GET | /api/settings | Administradores con settings.view | Todos los ajustes. search, category, page, page_count |
GET | /api/settings/:key | Administradores con settings.view | Un ajuste por clave |
PATCH | /api/settings/:key | Administradores con settings.edit | Cambiar el valor 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 los propios first_name, last_name, email, phone, profile_picture o country_id del administrador con sesión iniciada. Un password o role_ids en el cuerpo responde 400: 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 (file multipart, con path para la carpeta, for para el preajuste de tamaño como property, y type). Las fotos se recodifican, con un ancho máximo de 1920 píxeles; los vídeos se aceptan como MP4, WebM, MOV o M4V; 150 MB como máximo. Responde con la dirección 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/leads | 5 cada 10 minutos | Ninguno |
POST /api/viewings | 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.
Estudio de amueblado
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
Las rutas del estudio: generaciones, guardar un par amueblado y aprobarlo.
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.
Ruta del modo demostración
Incluido con tu compra. Inicia sesión para leerlo o ábrelo en tu descarga.
La ruta que existe solo en una compilación de demostración pública.