Skip to main content

Descripción General

Esta guía cubre el flujo completo para el monitoreo de transacciones, desde la creación hasta el análisis automático de riesgo y la generación de alertas. Las transacciones se evalúan según reglas específicas para detectar patrones sospechosos, montos inusuales, jurisdicciones de alto riesgo y otras señales de alerta.

Diagrama de Flujo

Paso 1: Crear Transacción

Las transacciones se crean a través de la API de transacciones con conversión automática de moneda y ejecución opcional de reglas. Endpoint: POST /transactions Solicitud:
{
  "externalId": "TXN-2024-00001",
  "type": "TRANSFER",
  "status": "PENDING",
  "amount": 50000,
  "currency": "EUR",
  "paymentMethod": "bank_transfer",
  "originEntityId": "sender-entity-uuid",
  "originName": "John Doe",
  "originCountry": "FR",
  "destinationEntityId": "receiver-entity-uuid",
  "destinationName": "Acme Corporation",
  "destinationCountry": "US",
  "description": "Business payment for services",
  "category": "B2B",
  "transactedAt": "2025-12-24T10:30:00Z",
  "executeRules": true,
  "metadata": {
    "ip": "192.168.1.1",
    "userAgent": "Mozilla/5.0...",
    "sessionId": "sess_abc123"
  }
}
Descripción de Campos:
CampoTipoRequeridoDescripción
externalIdstringSu identificador único para esta transacción
typeenumTipo de transacción: PAYMENT, TRANSFER, WITHDRAWAL, DEPOSIT, REFUND, CHARGEBACK, REVERSAL, FEE, ADJUSTMENT, OTHER
statusenumNoEstado de la transacción (por defecto: PENDING)
amountnumberMonto de la transacción en la moneda original
currencystringCódigo de moneda ISO 4217 (ej., USD, EUR, GBP)
paymentMethodenumNoMétodo de pago utilizado
originEntityIduuidNoID de la entidad emisora (si la entidad existe en el sistema)
originExternalIdstringNoIdentificador externo del emisor
originNamestringNoNombre del emisor
originCountrystringNoPaís del emisor (ISO 3166-1 alpha-2)
destinationEntityIduuidNoID de la entidad receptora (si la entidad existe en el sistema)
destinationExternalIdstringNoIdentificador externo del receptor
destinationNamestringNoNombre del receptor
destinationCountrystringNoPaís del receptor (ISO 3166-1 alpha-2)
descriptionstringNoDescripción de la transacción
categorystringNoCategoría de la transacción
transactedAtdatetimeNoCuándo ocurrió la transacción (por defecto: ahora)
executeRulesbooleanNoEjecutar reglas automáticamente (por defecto: true)
metadataobjectNoMetadatos personalizados adicionales
Lo que sucede automáticamente:
  1. Conversión de Moneda:
    • Si la moneda no es USD, convierte el monto a USD usando tasas de cambio en tiempo real
    • Almacena: amountInUsd, exchangeRate, rateSource, rateTimestamp
    • En caso de falla de conversión, la transacción aún se crea (sin monto en USD)
  2. Creación de Transacción:
    • Se crea el registro de transacción en la base de datos
    • Se genera un ID único
    • Se vincula a las entidades de origen/destino si se proporcionan
  3. Análisis Automático de Riesgo (si executeRules: true):
    • Ejecuta reglas específicas de transacción
    • Calcula la puntuación de riesgo
    • Crea alertas para las reglas que coinciden
    • Actualiza el estado de la transacción si es necesario
Respuesta (con análisis de riesgo):
{
  "transaction": {
    "id": "txn-uuid",
    "organizationId": "org-uuid",
    "externalId": "TXN-2024-00001",
    "type": "TRANSFER",
    "status": "PENDING",
    "amount": "50000.00",
    "currency": "EUR",
    "amountInUsd": "54500.00",
    "exchangeRate": "1.09",
    "rateSource": "fixer.io",
    "rateTimestamp": "2025-12-24T10:30:00Z",
    "convertedAt": "2025-12-24T10:30:01Z",
    "originEntityId": "sender-entity-uuid",
    "originName": "John Doe",
    "originCountry": "FR",
    "destinationEntityId": "receiver-entity-uuid",
    "destinationName": "Acme Corporation",
    "destinationCountry": "US",
    "riskScore": "68.00",
    "flagged": true,
    "riskFactors": [
      "Large transaction amount detected",
      "Cross-border transaction to high-risk jurisdiction"
    ],
    "transactedAt": "2025-12-24T10:30:00Z",
    "createdAt": "2025-12-24T10:30:02Z"
  },
  "rulesResult": {
    "success": true,
    "executed": true,
    "result": {
      "entityId": "txn-uuid",
      "entityType": "transaction",
      "riskScore": 68,
      "overallConfidence": 0.95,
      "totalRules": 8,
      "successfulRules": 3,
      "rulesExecuted": [
        {
          "ruleId": "rule-uuid-1",
          "ruleName": "Large Transaction Amount",
          "executed": true,
          "conditionsMet": true,
          "confidence": 0.98,
          "actionsExecuted": [
            {
              "type": "add_risk_score",
              "value": 30
            }
          ]
        },
        {
          "ruleId": "rule-uuid-2",
          "ruleName": "High-Risk Jurisdiction Transfer",
          "executed": true,
          "conditionsMet": true,
          "confidence": 0.92,
          "actionsExecuted": [
            {
              "type": "add_risk_score",
              "value": 38
            },
            {
              "type": "create_alert",
              "result": {
                "alertId": "alert-uuid"
              }
            }
          ]
        }
      ],
      "flags": [
        {
          "type": "LARGE_AMOUNT",
          "severity": "warning",
          "reason": "Transaction amount exceeds $50,000 threshold",
          "confidence": 0.98
        },
        {
          "type": "HIGH_RISK_JURISDICTION",
          "severity": "critical",
          "reason": "Transfer to high-risk jurisdiction",
          "confidence": 0.92
        }
      ]
    },
    "rulesTriggered": 3,
    "executionTimeMs": 850
  }
}

Paso 2: Conversión de Moneda

Cómo Funciona la Conversión de Moneda

  1. Conversión Automática: Si currency !== 'USD', el sistema automáticamente convierte a USD
  2. Proveedor: Usa el servicio ms-providers (configurado vía MS_PROVIDERS_URL)
  3. Caché: Las tasas de cambio se almacenan en caché por 1 minuto (TTL)
  4. Resiliencia: Patrón de circuit breaker con respaldo a caché obsoleto
  5. Degradación Controlada: Si la conversión falla, la transacción aún se crea (sin monto en USD)
Metadatos de Conversión:
{
  "amountInUsd": "54500.00",
  "exchangeRate": "1.09",
  "rateSource": "fixer.io",
  "rateTimestamp": "2025-12-24T10:30:00Z",
  "convertedAt": "2025-12-24T10:30:01Z"
}
Transacciones en USD:
  • Si currency: 'USD', no se necesita conversión
  • amountInUsd = amount
  • exchangeRate = 1
  • rateSource = 'no-conversion'

Manejo de Fallas de Conversión

Si el servicio de moneda no está disponible:
{
  "transaction": {
    "amount": "50000.00",
    "currency": "EUR",
    "amountInUsd": null,
    "exchangeRate": null,
    "rateSource": null
  }
}
La transacción se crea exitosamente, pero el monto en USD no está disponible. Las reglas que dependen de montos en USD usarán el monto original en su lugar.

Paso 3: Análisis de Riesgo de Transacciones

Cómo Funciona el Análisis de Riesgo de Transacciones

El RulesExecutionService evalúa las transacciones usando reglas específicas de transacción:
  1. Carga de Contexto:
    • Carga los datos de la transacción
    • Carga las entidades vinculadas (origen/destino) con datos de enriquecimiento
    • Prepara el contexto de ejecución
  2. Selección de Reglas:
    • Filtra reglas por targetEntityTypes: ['transaction']
    • Filtra por disparador: 'created' (para automático) o 'manual_evaluation'
    • Filtra por estado: enabled: true y status: 'active'
  3. Ejecución de Reglas:
    • Evalúa las condiciones de reglas contra el contexto de transacción
    • Ejecuta acciones para reglas coincidentes (agregar puntuación, crear alertas, actualizar estado)
    • Acumula la puntuación de riesgo
  4. Actualización de Puntuación:
    • Actualiza el riskScore de la transacción
    • Establece flagged: true si la puntuación > 50
    • Almacena el array riskFactors con razones
  5. Creación de Alertas:
    • Las reglas con acción create_alert generan alertas
    • Las alertas se vinculan a la transacción
    • Las alertas se consolidan en investigaciones después de un retraso de 5 segundos

Ejemplos de Reglas Específicas de Transacción

Regla 1: Monto de Transacción Grande
{
  "name": "Large Transaction Amount",
  "targetEntityTypes": ["transaction"],
  "triggers": ["created"],
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "amountInUsd",
        "operator": "greater_than",
        "value": 50000
      }
    ]
  },
  "actions": [
    {
      "type": "add_risk_score",
      "value": 30
    }
  ]
}
Regla 2: Transferencia a Jurisdicción de Alto Riesgo
{
  "name": "High-Risk Jurisdiction Transfer",
  "targetEntityTypes": ["transaction"],
  "triggers": ["created"],
  "conditions": {
    "operator": "OR",
    "conditions": [
      {
        "field": "originCountry",
        "operator": "in_list",
        "value": ["AF", "IR", "KP", "SY"]
      },
      {
        "field": "destinationCountry",
        "operator": "in_list",
        "value": ["AF", "IR", "KP", "SY"]
      }
    ]
  },
  "actions": [
    {
      "type": "add_risk_score",
      "value": 50
    },
    {
      "type": "create_alert",
      "severity": "critical",
      "description": "Transaction involves high-risk jurisdiction"
    }
  ]
}
Regla 3: Velocidad Rápida de Transacciones
{
  "name": "Rapid Transaction Velocity",
  "targetEntityTypes": ["transaction"],
  "triggers": ["created"],
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "originEntityId",
        "operator": "historical_count",
        "timeWindow": "1h",
        "comparison": "greater_than",
        "value": 10
      }
    ]
  },
  "actions": [
    {
      "type": "add_risk_score",
      "value": 40
    },
    {
      "type": "create_alert",
      "severity": "warning",
      "description": "Unusual transaction velocity detected"
    }
  ]
}
Regla 4: Transacción con Entidad Sancionada
{
  "name": "Sanctioned Entity Transaction",
  "targetEntityTypes": ["transaction"],
  "triggers": ["created"],
  "conditions": {
    "operator": "OR",
    "conditions": [
      {
        "field": "originEntity.enrichment.sanctionsMatch",
        "operator": "equals",
        "value": true
      },
      {
        "field": "destinationEntity.enrichment.sanctionsMatch",
        "operator": "equals",
        "value": true
      }
    ]
  },
  "actions": [
    {
      "type": "add_risk_score",
      "value": 100
    },
    {
      "type": "update_status",
      "status": "blocked"
    },
    {
      "type": "create_alert",
      "severity": "critical",
      "description": "Transaction involves sanctioned entity"
    }
  ]
}

Estructura del Contexto de Transacción

El motor de reglas recibe este contexto:
{
  "transaction": {
    "id": "txn-uuid",
    "type": "TRANSFER",
    "amount": 50000,
    "currency": "EUR",
    "amountInUsd": 54500,
    "originEntityId": "sender-uuid",
    "originName": "John Doe",
    "originCountry": "FR",
    "destinationEntityId": "receiver-uuid",
    "destinationName": "Acme Corp",
    "destinationCountry": "US",
    "transactedAt": "2025-12-24T10:30:00Z"
  },
  "originEntity": {
    "id": "sender-uuid",
    "type": "person",
    "name": "John Doe",
    "enrichmentData": {
      "isPep": false,
      "sanctionsMatch": false,
      "riskScore": 25
    }
  },
  "destinationEntity": {
    "id": "receiver-uuid",
    "type": "company",
    "name": "Acme Corp",
    "enrichmentData": {
      "sanctionsMatch": false,
      "riskScore": 42
    }
  }
}

Paso 4: Creación de Transacciones en Lote

Para escenarios de alto volumen, use el endpoint de lote para crear múltiples transacciones eficientemente. Endpoint: POST /transactions/batch Solicitud:
{
  "transactions": [
    {
      "externalId": "TXN-001",
      "type": "PAYMENT",
      "amount": 1000,
      "currency": "USD",
      "originName": "Customer A",
      "destinationName": "Merchant X"
    },
    {
      "externalId": "TXN-002",
      "type": "PAYMENT",
      "amount": 2500,
      "currency": "EUR",
      "originName": "Customer B",
      "destinationName": "Merchant X"
    }
  ],
  "executeRules": true,
  "skipDuplicates": true
}
Características:
  • Inserción masiva para mejor rendimiento
  • Conversión de moneda optimizada (almacena en caché las tasas para la misma moneda)
  • Detección automática de duplicados (por externalId)
  • Ejecución opcional de reglas en todas las transacciones
  • Máximo 1000 transacciones por lote
  • Tiempo de espera de 2 minutos
Respuesta:
{
  "summary": {
    "total": 2,
    "created": 2,
    "duplicates": 0,
    "failed": 0,
    "flagged": 0,
    "totalCost": 150
  },
  "transactions": [
    {
      "id": "txn-uuid-1",
      "externalId": "TXN-001",
      "riskScore": "15.00",
      "flagged": false
    },
    {
      "id": "txn-uuid-2",
      "externalId": "TXN-002",
      "riskScore": "22.00",
      "flagged": false
    }
  ],
  "executionTimeMs": 3200
}

Paso 5: Análisis Manual de Transacciones

Si creó una transacción con executeRules: false, puede activar manualmente el análisis de riesgo más tarde. Endpoint: POST /entities/:transactionId/analyze Solicitud:
{
  "entityType": "transaction",
  "enrichIfNeeded": false
}
Casos de Uso:
  • Re-analizar la transacción después del enriquecimiento de la entidad
  • Analizar la transacción después de actualizaciones de reglas
  • Re-puntuación periódica de transacciones pendientes
Respuesta: Igual que el resultado del análisis de riesgo automático

Paso 6: Consultas y Monitoreo de Transacciones

Listar Transacciones con Filtrado

Endpoint: GET /transactions Parámetros de Consulta:
GET /transactions?flagged=true&minAmount=10000&sortBy=risk_score&sortOrder=desc&limit=50
Filtros Disponibles:
  • flagged: Filtrar por estado marcado (true, false, all)
  • minAmount / maxAmount: Filtro de rango de monto (en moneda original)
  • currency: Filtrar por moneda
  • type: Filtrar por tipo de transacción
  • status: Filtrar por estado de transacción
  • entityId: Filtrar por entidad de origen o destino
  • startDate / endDate: Filtro de rango de fechas
  • search: Búsqueda de texto libre (externalId, description, names)
  • sortBy: Campo de ordenamiento (transacted_at, amount, risk_score, created_at)
  • sortOrder: Dirección de ordenamiento (asc, desc)
Respuesta:
{
  "transactions": [
    {
      "id": "txn-uuid",
      "externalId": "TXN-2024-00001",
      "type": "TRANSFER",
      "amount": "50000.00",
      "currency": "EUR",
      "amountInUsd": "54500.00",
      "riskScore": "68.00",
      "flagged": true,
      "originName": "John Doe",
      "destinationName": "Acme Corp",
      "transactedAt": "2025-12-24T10:30:00Z"
    }
  ],
  "pagination": {
    "total": 150,
    "limit": 50,
    "offset": 0
  }
}

Obtener Detalles de Transacción

Endpoint: GET /transactions/:transactionId Respuesta: Objeto completo de transacción con detalles de análisis de riesgo

Ver Alertas de Transacción

Endpoint: GET /alerts?transactionId=:transactionId Respuesta: Todas las alertas generadas para la transacción

Paso 7: Consolidación de Alertas e Investigaciones

Después del análisis de riesgo, las alertas se consolidan automáticamente en investigaciones:
  1. Creación de Alertas: Las reglas con acción create_alert crean alertas individuales
  2. Retraso de 5 Segundos: El sistema espera para recopilar todas las alertas relacionadas
  3. Consolidación: Las alertas relacionadas se consolidan en una sola investigación
  4. Creación de Investigación: Se crea la investigación con:
    • Prioridad basada en la severidad de alerta más alta
    • Estado: “open”
    • Todas las alertas relacionadas vinculadas
  5. Notificaciones: Se notifica a los analistas sobre la nueva investigación
Estructura de Investigación:
{
  "id": "investigation-uuid",
  "organizationId": "org-uuid",
  "title": "High-Risk Transaction: TXN-2024-00001",
  "priority": "critical",
  "status": "open",
  "relatedTransactions": ["txn-uuid"],
  "relatedEntities": ["sender-uuid", "receiver-uuid"],
  "alerts": [
    {
      "id": "alert-uuid-1",
      "severity": "critical",
      "type": "HIGH_RISK_JURISDICTION",
      "description": "Transaction involves high-risk jurisdiction"
    },
    {
      "id": "alert-uuid-2",
      "severity": "warning",
      "type": "LARGE_AMOUNT",
      "description": "Transaction amount exceeds threshold"
    }
  ],
  "createdAt": "2025-12-24T10:30:07Z"
}

Mejores Prácticas

  1. Siempre Habilite Reglas Automáticas: Establezca executeRules: true (por defecto) para detectar transacciones sospechosas inmediatamente.
  2. Use la API de Lote para Volumen: Para importaciones masivas o escenarios de alto volumen, use /transactions/batch para un mejor rendimiento.
  3. Vincule Entidades: Siempre proporcione originEntityId y destinationEntityId cuando estén disponibles. Esto habilita:
    • Datos de enriquecimiento de entidad en la evaluación de reglas
    • Mejor agregación de riesgo
    • Patrones de transacción a nivel de entidad
  4. Mapeo de ID Externo: Siempre establezca un externalId único para correlación con sus sistemas.
  5. Manejo de Moneda: El sistema maneja la conversión de moneda automáticamente. Asegúrese de que MS_PROVIDERS_URL esté configurado correctamente.
  6. Configuración de Reglas: Configure las reglas de transacción para su apetito de riesgo:
    • Umbrales de monto apropiados para su negocio
    • Jurisdicciones de alto riesgo basadas en sus requisitos de cumplimiento
    • Reglas de velocidad basadas en patrones normales de transacción
  7. Gestión de Estado: Use el campo status de la transacción para rastrear el ciclo de vida:
    • PENDING → APPROVED/REJECTED/CANCELLED
    • Actualice el estado basado en revisión manual o validación externa
  8. Monitoreo: Configure dashboards para monitorear:
    • Tasa de transacciones marcadas
    • Puntuaciones de riesgo promedio
    • Volumen de alertas por tipo
    • Tiempo de resolución de investigaciones

Patrones Avanzados

Patrón 1: El Riesgo de Entidad Afecta el Riesgo de Transacción

Configure reglas que consideren el riesgo de la entidad:
{
  "name": "High-Risk Entity Transaction",
  "conditions": {
    "operator": "OR",
    "conditions": [
      {
        "field": "originEntity.riskScore",
        "operator": "greater_than",
        "value": 70
      },
      {
        "field": "destinationEntity.riskScore",
        "operator": "greater_than",
        "value": 70
      }
    ]
  },
  "actions": [
    {
      "type": "add_risk_score",
      "value": 35
    }
  ]
}

Patrón 2: Detección de Velocidad y Patrones

Use consultas históricas en reglas:
{
  "name": "Unusual Transaction Pattern",
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "originEntityId",
        "operator": "historical_sum",
        "aggregateField": "amountInUsd",
        "timeWindow": "24h",
        "comparison": "greater_than",
        "value": 100000
      }
    ]
  }
}

Patrón 3: Verificación de Sanciones en Transacción

{
  "name": "Transaction Sanctions Check",
  "conditions": {
    "operator": "OR",
    "conditions": [
      {
        "field": "originEntity.enrichment.sanctionsMatch",
        "operator": "equals",
        "value": true
      },
      {
        "field": "destinationEntity.enrichment.sanctionsMatch",
        "operator": "equals",
        "value": true
      }
    ]
  },
  "actions": [
    {
      "type": "update_status",
      "status": "blocked"
    },
    {
      "type": "add_risk_score",
      "value": 100
    }
  ]
}

Manejo de Errores

Fallas en la Conversión de Moneda

{
  "transaction": {
    "amountInUsd": null,
    "exchangeRate": null
  },
  "warnings": [
    "Currency conversion failed: fixer.io service unavailable"
  ]
}
La transacción se crea exitosamente, las reglas usan el monto original.

Fallas en la Ejecución de Reglas

{
  "rulesResult": {
    "success": false,
    "error": "Rules engine timeout after 30000ms",
    "executed": false
  }
}
La transacción se crea, pero el riesgo no se calcula. Active el análisis manualmente más tarde.

Fallas Parciales en Lote

{
  "summary": {
    "total": 100,
    "created": 95,
    "failed": 5
  },
  "failures": [
    {
      "externalId": "TXN-042",
      "error": "Validation failed: invalid currency code"
    }
  ]
}
Las transacciones exitosas se crean, las fallas se reportan por separado.

Próximos Pasos