Mapa de endpoints
Documentación visual de la API
Todos los endpoints del proyecto agrupados por recurso, con método HTTP, ruta exacta y una descripción corta de su función.
tag: contactos
/api/contactos
Alta y consulta de contactos generales enviados desde formularios.
- GET
/api/contactosLista todos los contactos ordenados por fecha de creacion descendente.
Ver detalle técnico
RequestSin body. Consulta simple ordenada por fechaCreacion desc.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Responses200 OK - POST
/api/contactosCrea un contacto nuevo validando los datos recibidos.
Ver detalle técnico
RequestBody JSON con datos del contacto. Valida formato antes de insertar.
Route paramsSin parámetros de ruta.
Body fieldsnombrestringrequiredNombre completo del contacto.
emailstringrequiredCorreo valido. Se normaliza a minusculas.
telefonostringrequiredTelefono de contacto.
aceptaPromocionesbooleanrequiredAcepta true/false o equivalentes parseables.
preguntastring | nulloptionalConsulta adicional. Puede enviarse null.
Example JSON{ "nombre": "Marta Soto", "email": "marta.duplicado.postman@example.com", "telefono": "+5215555555510", "aceptaPromociones": true, "pregunta": "Tienen disponibilidad inmediata?" }Responses201 Created400 Bad RequestNotesDevuelve mensaje de error si el body no cumple la validacion.
tag: productos
/api/productos
Catalogo de productos con variantes para filtrar, crear, actualizar y desactivar.
- GET
/api/productosLista todos los productos registrados, sin filtrar por estado o visibilidad.
Ver detalle técnico
RequestSin body. Devuelve catalogo completo.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Responses200 OK - POST
/api/productosCrea un producto nuevo despues de validar nombre, categoria, precios y banderas.
Ver detalle técnico
RequestBody JSON con datos del producto. Requiere validacion previa.
Route paramsSin parámetros de ruta.
Body fieldsnombrestringrequiredNombre comercial del producto.
categoriastringrequiredCategoria visible o interna del producto.
descripcionstringrequiredDescripcion del producto.
preciostring | numberrequiredValor numerico con hasta 2 decimales.
imagenUrlstringrequiredURL de la imagen principal.
activobooleanoptionalSi no se envia, toma true por defecto.
visiblebooleanoptionalSi no se envia, toma true por defecto.
Example JSON{ "nombre": "Producto Postman", "categoria": "Accesorios", "descripcion": "Creado desde la coleccion de Postman", "precio": "220.00", "imagenUrl": "https://example.com/postman.jpg", "activo": true, "visible": true }Responses201 Created400 Bad RequestNotesactivo y visible son opcionales en create; si no llegan, ambos quedan en true.
- GET
/api/productos/activosDevuelve solo productos activos y visibles para consumo publico.
Ver detalle técnico
RequestSin body. Filtra por activo=true y visible=true.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Responses200 OK - GET
/api/productos/visiblesDevuelve productos visibles, esten o no activos.
Ver detalle técnico
RequestSin body. Filtra por visible=true.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Responses200 OK - PUT
/api/productos/[id]Actualiza un producto existente usando un id entero positivo.
Ver detalle técnico
RequestBody JSON parcial o completo. Requiere id entero positivo en ruta.
Route paramsidintegerrequiredIdentificador del producto. Debe ser entero positivo.
Body fieldsnombrestringoptionalNuevo nombre del producto.
categoriastringoptionalNueva categoria.
descripcionstringoptionalNueva descripcion.
preciostring | numberoptionalNuevo precio con hasta 2 decimales.
imagenUrlstringoptionalNueva URL de imagen.
activobooleanoptionalPermite activar o desactivar explicitamente.
visiblebooleanoptionalControla la visibilidad publica.
Example JSON{ "nombre": "Producto Actualizado Postman", "categoria": "Hogar", "precio": "180.00", "visible": false }Responses200 OK400 Bad RequestNotesEl endpoint valida el parametro id antes de intentar actualizar. Debes enviar al menos un campo.
- DELETE
/api/productos/[id]Realiza baja logica del producto cambiando activo a false.
Ver detalle técnico
RequestSin body. Requiere id entero positivo en ruta.
Route paramsidintegerrequiredIdentificador del producto. Debe ser entero positivo.
Body fieldsEste endpoint no recibe body.
Responses200 OK400 Bad RequestNotesNo elimina el registro fisicamente; actualiza activo=false.
tag: contactos-whats
/api/contactos-whats
Solicitudes de cotizacion iniciadas desde WhatsApp.
- GET
/api/contactos-whatsLista las solicitudes de WhatsApp mas recientes primero.
Ver detalle técnico
RequestSin body. Ordena por fechaCreacion desc.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Responses200 OK - POST
/api/contactos-whatsRegistra una nueva solicitud con nombre opcional, estatus y fecha estimada opcional.
Ver detalle técnico
RequestBody JSON con datos del pedido. Acepta nombre y fecha estimada opcionales.
Route paramsSin parámetros de ruta.
Body fieldsnombrestring | nulloptionalNombre del cliente. Puede ser null.
cotizacionstringrequiredTexto principal de la solicitud.
clienteEstatusstringoptionalSi se omite, toma pendiente por defecto.
fechaEntregaEstimadastring | nulloptionalFecha en formato YYYY-MM-DD o null.
Example JSON{ "nombre": null, "cotizacion": "Necesito una cotizacion para 20 piezas del Producto Base", "clienteEstatus": "pendiente", "fechaEntregaEstimada": "2026-04-20" }Responses201 Created400 Bad Request - PATCH
/api/contactos-whats/[id]Actualiza unicamente el estatus del cliente de una solicitud de WhatsApp existente.
Ver detalle técnico
RequestBody JSON con solo clienteEstatus. Requiere id entero positivo en ruta.
Route paramsidintegerrequiredIdentificador de la solicitud. Debe ser entero positivo.
Body fieldsclienteEstatusstringrequiredNuevo estatus del cliente. Debe ser un texto no vacio.
Example JSON{ "clienteEstatus": "confirmado" }Responses200 OK400 Bad Request404 Not FoundNotesRechaza cualquier campo distinto de clienteEstatus para mantener la actualizacion estrictamente acotada.
tag: boton-whats
/api/boton-whats
Registro de clics del boton de mandar mensaje por WhatsApp.
- GET
/api/boton-whatsLista todos los clics registrados del boton de WhatsApp, mostrando primero los mas recientes.
Ver detalle técnico
RequestSin body. Ordena por fechaClick desc y luego por id desc.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Responses200 OK - POST
/api/boton-whatsRegistra un clic del boton de WhatsApp a partir de los headers de la peticion.
Ver detalle técnico
RequestSin body obligatorio. Obtiene IP, dispositivo, navegador y fechaClick desde la peticion actual.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Example JSON{}Responses201 CreatedNotesLa IP se toma de headers proxy comunes; dispositivo y navegador se derivan del user-agent. En Postman puedes simularlo añadiendo los headers 'x-forwarded-for' y 'user-agent'.
tag: cotizacion-detalle
/api/cotizacion-detalle
Detalle de piezas y productos vinculados a una cotizacion de WhatsApp.
- POST
/api/cotizacion-detalleCrea un detalle de cotizacion validando que existan el pedido y el producto activo.
Ver detalle técnico
RequestBody JSON con idPedido, idProducto y numeroPiezas.
Route paramsSin parámetros de ruta.
Body fieldsidPedidointegerrequiredId del registro de contactoWhats.
idProductointegerrequiredId del producto activo relacionado.
numeroPiezasintegerrequiredCantidad de piezas. Debe ser entero positivo.
Example JSON{ "idPedido": 1, "idProducto": 1, "numeroPiezas": 20 }Responses201 Created400 Bad RequestNotesComprueba que exista el contactoWhats y que el producto este activo.
tag: usuarios-acceso
/api/usuarios-acceso
Gestion de usuarios administrativos y validacion de permisos.
- GET
/api/usuarios-accesoLista usuarios de acceso administrativo ordenados por creacion.
Ver detalle técnico
RequestSin body. Consulta usuarios administrativos.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Responses200 OK - POST
/api/usuarios-accesoCrea un usuario administrativo y guarda la contrasena hasheada.
Ver detalle técnico
RequestBody JSON con nombreUsuario, contrasena, nombreCompleto y permiso.
Route paramsSin parámetros de ruta.
Body fieldsnombreUsuariostringrequiredMinimo 3 caracteres. Se normaliza a minusculas.
contrasenastringrequiredMinimo 6 caracteres.
nombreCompletostringrequiredNombre descriptivo del usuario.
tienePermisobooleanrequiredIndica acceso a la pagina administrativa.
Example JSON{ "nombreUsuario": "supervisor", "contrasena": "Supervisor123", "nombreCompleto": "Supervisor Comercial", "tienePermiso": true }Responses201 Created400 Bad Request409 ConflictNotesSi el nombreUsuario ya existe responde conflicto por restriccion unica.
- PUT
/api/usuarios-acceso/[id]Actualiza usuario, permisos y contrasena de forma parcial usando id.
Ver detalle técnico
RequestBody JSON parcial. Requiere id entero positivo en ruta.
Route paramsidintegerrequiredIdentificador del usuario. Debe ser entero positivo.
Body fieldsnombreUsuariostringoptionalMinimo 3 caracteres. Se normaliza a minusculas.
contrasenastringoptionalMinimo 6 caracteres.
nombreCompletostringoptionalNuevo nombre descriptivo del usuario.
tienePermisobooleanoptionalActualiza el permiso administrativo.
Example JSON{ "nombreCompleto": "Supervisor Ventas", "tienePermiso": false, "contrasena": "NuevaClave123" }Responses200 OK400 Bad Request404 Not Found409 ConflictNotesTodos los campos son opcionales, pero debes enviar al menos uno.
- POST
/api/usuarios-acceso/validarValida credenciales y confirma si el usuario tiene permiso administrativo.
Ver detalle técnico
RequestBody JSON con nombreUsuario y contrasena.
Route paramsSin parámetros de ruta.
Body fieldsnombreUsuariostringrequiredMinimo 3 caracteres.
contrasenastringrequiredMinimo 6 caracteres.
Example JSON{ "nombreUsuario": "admin", "contrasena": "Admin123" }Responses200 OK401 Unauthorized403 Forbidden400 Bad Request
tag: inicios-sesion
/api/inicios-sesion
Registro de accesos administrativos exitosos.
- POST
/api/inicios-sesionValida credenciales, verifica permisos y registra el inicio de sesion.
Ver detalle técnico
RequestBody JSON con nombreUsuario y contrasena.
Route paramsSin parámetros de ruta.
Body fieldsnombreUsuariostringrequiredMinimo 3 caracteres.
contrasenastringrequiredMinimo 6 caracteres.
Example JSON{ "nombreUsuario": "admin", "contrasena": "Admin123" }Responses201 Created401 Unauthorized403 Forbidden400 Bad Request
tag: logs-errores
/api/logs-errores
Consulta y registro de errores provenientes de dominios externos.
- GET
/api/logs-erroresLista errores ordenados por fecha de ocurrencia y fecha de creacion.
Ver detalle técnico
RequestSin body. Ordena por fechaOcurrencia y fechaCreacion descendentes.
Route paramsSin parámetros de ruta.
Body fieldsEste endpoint no recibe body.
Responses200 OK - POST
/api/logs-erroresRegistra un log de error con dominio, origen, metodo, codigo y contexto.
Ver detalle técnico
RequestBody JSON con datos del error y su contexto.
Route paramsSin parámetros de ruta.
Body fieldsdominiostringrequiredSistema o dominio que origino el error.
origenstring | nulloptionalModulo o pantalla de origen.
metodostring | nulloptionalMetodo HTTP o accion. Se normaliza a mayusculas.
codigostring | nulloptionalCodigo interno del error.
mensajestringrequiredMensaje principal del error.
detallestring | nulloptionalDetalle ampliado del error.
contextostring | object | nulloptionalPuede enviarse como JSON serializable o texto.
fechaOcurrenciastring | nulloptionalFecha-hora valida. Si se omite, usa la fecha actual.
Example JSON{ "dominio": "frontend-web", "origen": "checkout", "metodo": "POST", "codigo": "PAYMENT_TIMEOUT", "mensaje": "No fue posible completar el cobro.", "detalle": "La pasarela no respondio dentro del tiempo esperado.", "contexto": { "pedidoId": 123, "traceId": "req-01HXYZ" }, "fechaOcurrencia": "2026-04-05T18:45:12.000Z" }Responses201 Created400 Bad Request