Ir al artículo
Aniq-UI

VelraReferencia de la API

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:

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

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 mantiene el envoltorio, con success: false y el estado HTTP:

Error
{
  "success": false,
  "data": null,
  "message": "…",
  "errors": { "email": ["…"] }
}
  • message es una frase en el idioma de la petición.
  • errors aparece en un fallo de validación, con los problemas por campo, indexados por la ruta que envió el cliente (como title.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 responde 403.
  • Una petición que supera un límite responde 429.

Listas y paginación

Una lista
{ "data": [ ], "page": 1, "limit": 12, "total": 15, "totalPages": 2 }
  • Las propiedades, consultas y visitas se paginan con page y page_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 page y page_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 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 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

  1. Iniciar sesión como administrador

    Terminal
    curl -X POST http://localhost:8000/api/auth/login \
      -H "Content-Type: application/json" \
      -d '{"email":"admin@velra.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/leads -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.
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 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étodoRutaQuién puede llamarlaQué hace
GET/api/propertiesCualquieraViviendas 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/featuredCualquieraLas 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/facetsCualquieraViviendas publicadas contadas por finalidad, por tipo y por barrio, para los filtros y la página de inicio
GET/api/properties/lookupCualquieraViviendas publicadas por id, para viviendas guardadas y comparar: ?ids=1,2,3, como máximo 12
GET/api/properties/:slug/similarCualquieraHasta tres viviendas similares publicadas
GET/api/properties/:slugCualquieraUna vivienda publicada completa, con su galería, su barrio y su estancia amueblada pública

Barrios y ajustes de la agencia

MétodoRutaQuién puede llamarlaQué hace
GET/api/neighborhoodsCualquieraLos barrios marcados como visibles, en su orden
GET/api/settings/publicCualquieraLos 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étodoRutaQuién puede llamarlaQué hace
POST/api/leadsCualquieraEl 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/viewingsCualquieraUna 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_token repetido devuelve el recibo del primer envío en lugar de guardar un segundo.
  • Un campo company rellenado 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 responde 400 con preferred_time_too_soon en preferred_at.
  • Cada dirección puede enviar cinco de cada en diez minutos; la siguiente responde 429.

Gestionar propiedades

MétodoRutaQuién puede llamarlaQué hace
GET/api/properties/manageAdministradores con properties.viewTodas las propiedades, borradores incluidos. purpose, type, status, q, page, page_size; devuelve counts de todas, publicadas y borradores
GET/api/properties/manage/:idAdministradores con properties.viewUna propiedad completa, con su galería y sus pares de amueblado
POST/api/properties/manageAdministradores con properties.createCrear un borrador. Obligatorios: title (en, ar), purpose, type, price, bedrooms, bathrooms, area_sqm
PUT/api/properties/manage/:idAdministradores con properties.editCambiar cualquier campo, la galería incluida (media, hasta 40 elementos)
PATCH/api/properties/manage/:id/statusAdministradores con properties.publishDefinir status: draft, published, sold, rented o archived
PUT/api/properties/manage/:id/mediaAdministradores con properties.editReemplazar la galería, en orden, con un elemento marcado como is_cover
DELETE/api/properties/manage/:idAdministradores con properties.deleteEliminar la propiedad

Consultas y visitas

MétodoRutaQuién puede llamarlaQué hace
GET/api/leadsAdministradores con leads.viewConsultas. status, q, received_within_days, page, page_size; con recuentos por estado
GET/api/leads/:idAdministradores con leads.viewUna consulta con su propiedad, notas y visita
PATCH/api/leads/:idAdministradores con leads.editDefinir status (new, contacted, qualified, closed) y notes
GET/api/viewingsAdministradores con viewings.viewVisitas. status, q, scheduled_from, scheduled_to, page, page_size; con recuentos por estado
GET/api/viewings/:idAdministradores con viewings.viewUna visita con su consulta y propiedad
PATCH/api/viewings/:idAdministradores con viewings.editaction (confirm, complete, cancel), confirmed_at (ISO 8601) y admin_notes. Una acción desde el estado equivocado responde 400
GET/api/overviewAdministradores con overview.viewEl 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étodoRutaQuién puede llamarlaQué hace
GET/api/neighborhoods/manageAdministradores con neighborhoods.viewTodos los barrios, los ocultos incluidos
POST/api/neighborhoods/manageAdministradores con neighborhoods.createAñ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/:idAdministradores con neighborhoods.editCambiar uno
DELETE/api/neighborhoods/manage/:idAdministradores con neighborhoods.deleteEliminar uno; sus viviendas siguen existiendo sin barrio
GET/api/settingsAdministradores con settings.viewTodos los ajustes. search, category, page, page_count
GET/api/settings/:keyAdministradores con settings.viewUn ajuste por clave
PATCH/api/settings/:keyAdministradores con settings.editCambiar el valor 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 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/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 (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

RutaLímiteVariable
POST /api/auth/login10 inicios de sesión fallidos cada 15 minutosRATE_LIMIT_LOGIN
POST /api/leads5 cada 10 minutosNinguno
POST /api/viewings5 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.

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.

¿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.