Project Story — Bankurity (Polihacks 2025)

About the project

Bankurity (Polihacks 2025) nace como una herramienta para ayudar a identificar llamadas y patrones de fraude bancario, con especial foco en la protección de personas de la tercera edad. El sistema combina un backend en Node.js que expone endpoints para clasificación y detección, con una app iOS llamada Bankurity desarrollada en Swift/SwiftUI que actúa como interfaz para usuarios y operadores.

Inspiration

La idea surgió al ver la persistente problemática de estafas telefónicas dirigidas a personas mayores: con frecuencia los fraudes son sociales (ingeniería social), rápidos y difíciles de verificar en el momento. Queríamos construir una solución práctica que:

  • Ayude a clasificar conversaciones o fragmentos de audio/texto como sospechosos.
  • Brinde una interfaz accesible para reportes y apoyo humano.
  • Use modelos de lenguaje y análisis semántico para asistir, sin suplantar la revisión humana.

What we learned

Durante el desarrollo aprendimos tanto en lo técnico como en lo de producto:

  • Integración con APIs generativas para análisis semántico y explicación de decisiones.
  • Diseño de una API REST modular en Express con rutas separadas para clasificación, chat y detección.
  • Implementación de buenas prácticas para manejo de errores y autenticación en middleware.
  • Cuestiones de privacidad y ética: minimizar la retención de datos, permitir transparencia y consentimiento.
  • La importancia del feedback humano: los operadores deben poder revisar y corregir decisiones del modelo.

How we built it

Estructura y decisiones principales:

  • Backend: Node.js + Express. Endpoints agrupados bajo /api/v1 como /clasificar, /chat, /detection, /chat-stream.
    • Servicios (algoritmo.service.js, chat.service.js, gemini.service.js) encapsulan la lógica de clasificación y llamadas a APIs externas.
    • Middlewares para autenticación y manejo de errores.
  • App iOS: proyecto en estafas-bancarias/ cuyo producto es la app Bankurity, hecha en Swift/SwiftUI para reportes, visualización de alertas y comunicación con operadores.
  • Integración con servicios de modelos (p. ej. a través de gemini.service.js) para obtener puntuaciones de riesgo y explicaciones tersas.

Proceso resumido:

  1. Prototipo de la API y endpoints básicos.
  2. Servicio de clasificación que acepta texto y devuelve etiqueta + score.
  3. Conectar la app iOS (Bankurity) con la API para reportes y revisión.
  4. Añadir middlewares de seguridad y validaciones.

Challenges

  • Falta de dataset etiquetado: sin datos reales es difícil medir y entrenar modelos robustos.
  • Trade-off entre falsos positivos y falsos negativos: salvar a usuarios vulnerables puede requerir priorizar recall, pero eso genera más alertas que deben revisarse.
  • Privacidad y cumplimiento: diseñar para minimizar datos sensibles y proteger la información en tránsito y en reposo.
  • Consistencia de configuración: asegurar que la documentación (README) y los valores por defecto del servidor estén sincronizados.

Ethics and privacy

  • Minimizar recolección: guardar sólo lo necesario para trazabilidad y mejora.
  • Consentimiento: las llamadas/reportes deben indicarse como analizados por IA y los usuarios deben poder gestionar permisos.
  • Transparencia: proveer score y explicación breve de la alerta para revisión humana.
  • Sesgo: evaluar posibles sesgos del modelo y mitigarlos con datos y reglas.

Current results & assumptions

  • Prototipo funcional con endpoints para clasificación y chat.
  • Integración inicial con servicios generativos para análisis semántico.
  • App Bankurity: interfaz mínima viable para reportes y revisión.

Nota: para obtener validación cuantitativa necesitamos un dataset etiquetado; el sistema actual es base para iterar con datos reales.

Next steps / Roadmap

  • Recopilar y anonimizar datos reales con consentimiento para entrenar y validar modelos.
  • Pipeline de reentrenamiento con etiquetado humano.
  • Pruebas automáticas y monitorización por endpoint.
  • Despliegue controlado y pruebas A/B para seleccionar umbrales operativos.
  • Mejoras UX en Bankurity: notificaciones, flujos de escalado y accesibilidad.

How to run locally (quick)

cd backend
npm install
npm run dev

Por defecto el README contiene PORT=3000 en el .env de ejemplo; el servidor lee la variable PORT del entorno para arrancar en otro puerto si se prefiere.

Closing

Bankurity es una mezcla de tecnología y propósito social: el alcance real depende de colaborar con expertos, iterar con datos y priorizar la privacidad y la seguridad de las personas.

Share this project:

Updates