Saltar al contenido principal

Referencia de la API

API REST en JSON. Todas las rutas cuelgan de /api.

EntornoURL base
Desarrollo localhttp://localhost:3000/api
Producción (Vercel)https://<dominio-de-la-app>/api

Autenticación​

Casi todos los endpoints requieren un access token JWT en la cabecera:

Authorization: Bearer <token>

El token se obtiene con POST /api/auth/login y dura 8 horas por defecto. Cuando vence, se renueva con POST /api/auth/refresh.

Payload del token:

{ "sub": "<uuid del usuario>", "role": "admin | advisor | client", "email": "...", "iat": 0, "exp": 0 }

En esta referencia, cada endpoint indica su nivel de acceso:

EtiquetaSignificado
PúblicoNo requiere token
Público (auth opcional)Funciona sin token; con token de admin habilita campos extra
AutenticadoCualquier rol con token válido
admin / advisor / clientSolo esos roles

Formato de errores​

Todas las respuestas de error tienen esta forma:

{
"error": "CODIGO_EN_MAYUSCULAS",
"message": "Descripción legible",
"details": { }
}

details es opcional. En errores de validación contiene el resultado de ZodError.flatten():

{
"error": "VALIDATION_ERROR",
"message": "Invalid request",
"details": {
"formErrors": [],
"fieldErrors": { "email": ["Invalid email"] }
}
}

Códigos comunes​

HTTPerrorCuándo
400VALIDATION_ERROREl cuerpo o los parámetros no cumplen el esquema
400EMPTY_PATCHUn PUT/PATCH sin campos para actualizar
401UNAUTHENTICATEDFalta el token
401INVALID_TOKENToken inválido o vencido
403FORBIDDENEl rol no tiene permiso
404NOT_FOUNDRecurso inexistente, fuera de tu alcance o ruta inexistente
409DUPLICATE_*Violación de unicidad (NIT, email)
422variosRegla de negocio incumplida (p. ej. ROUTE_CLOSED)
500INTERNALError no controlado
502SIIGO_*Falla al hablar con SIIGO

Convenciones​

  • Nombres en camelCase en JSON (priceListId), aunque la base de datos use snake_case. Algunos endpoints de listado devuelven filas crudas en snake_case (se indica en cada caso).
  • IDs son UUID v4, salvo los IDs de SIIGO (cadenas) y siigoSellerId (entero).
  • Creación responde 201 con { "id": "<uuid>" }, salvo que se indique otra cosa.
  • Borrado responde 204 sin cuerpo. Rutas y usuarios se desactivan (active = false); los demás recursos se borran físicamente.
  • Actualizaciones parciales: los PUT aceptan cualquier subconjunto de campos. En varios recursos se usa COALESCE, por lo que enviar null no borra el valor (se indica en cada recurso).
  • Montos en pesos colombianos (COP) como número.
  • Fechas en ISO 8601. La zona horaria de negocio es America/Bogota.
  • Límites: cuerpo JSON máximo de 2 MB; imágenes máximo 5 MB.

Índice de endpoints​

Salud​

MétodoRutaAcceso
GET/api/healthPúblico

200 { "ok": true, "ts": "...", "db": "connected" } o 503 { "ok": false, "db": "<error>" } si la base de datos no responde.

Recursos​

MétodoRutaAccesoPágina
POST/api/auth/loginPúblicoAuth
POST/api/auth/refreshPúblicoAuth
GET/api/auth/meAutenticadoAuth
GET/api/productsAutenticadoProductos
GET/api/products/catalogPúblicoProductos
POST/api/productsadminProductos
PUT/api/products/:idadminProductos
POST/api/products/:id/imageadminProductos
GET/api/quotationsAutenticadoCotizaciones
POST/api/quotationsclientCotizaciones
GET/api/quotations/:idAutenticadoCotizaciones
PATCH/api/quotations/:idadmin, advisorCotizaciones
PATCH/api/quotations/:id/statusadmin, advisorCotizaciones
POST/api/quotations/:id/commentsAutenticadoCotizaciones
POST/api/quotations/:id/cloneclientCotizaciones
GET/api/routesAutenticadoRutas
GET/api/routes/me/cutoffclientRutas
POST/api/routesadminRutas
PUT/api/routes/:idadminRutas
DELETE/api/routes/:idadminRutas
GET/api/categoriesAutenticado o API key catalog:readCategorías
POST / PUT / DELETE/api/categories[/:id]adminCategorías
GET/api/price-listsAutenticadoListas de precios
POST / PUT / DELETE/api/price-lists[/:id]adminListas de precios
GET/api/price-lists/:id/productsAutenticadoListas de precios
POST/api/price-lists/:id/productsadminListas de precios
PUT/api/price-lists/:id/clientsadminListas de precios
GET/api/companiesAutenticadoEmpresas
POST/api/companiesPúblicoEmpresas
PUT / DELETE/api/companies/:idadminEmpresas
POST/api/companies/:id/branchesPúblico (auth opcional)Empresas
PUT / DELETE/api/companies/:id/branches/:branchIdadminEmpresas
GET/api/promotionsAutenticadoPromociones
POST / PUT / DELETE/api/promotions[/:id]adminPromociones
GET/api/usersadminUsuarios
POST/api/usersPúblico (auth opcional)Usuarios
PUT / DELETE/api/users/:idadminUsuarios
GET/api/stats/adminadminEstadísticas
GET/api/stats/advisoradmin, advisorEstadísticas
GET/api/advisor/clientsadmin, advisorAsesor
GET/api/advisor/clients/:clientId/quotationsadmin, advisorAsesor
GET/api/advisor/companiesadmin, advisorAsesor
GET/api/my-companyclientMi empresa
POST / PUT / DELETE/api/my-company/users[/:id]clientMi empresa
POST / PUT / DELETE/api/my-company/branches[/:id]clientMi empresa
GET / POST / DELETE/api/api-keys[/:id]adminAPI keys de integración
*/api/integrations/siigo/*adminSIIGO

Colección de Postman​

En la raíz del repositorio está daval_api.postman_collection.json (y la carpeta postman/) con ejemplos listos para importar.