Skip to main content

Introdução

O motor de regras do gu1 permite criar lógica personalizada para analisar transações em tempo real. As regras podem ser síncronas (afetam a decisão da transação) ou assíncronas (apenas monitoramento).

Regras Síncronas vs Assíncronas

Regras Síncronas (SYNC)

Executam durante a chamada da API e afetam a decisão da transação Quando usar:
  • Bloquear transações fraudulentas
  • Impor limites de transação
  • Exigir autenticação adicional
  • Requisitos regulatórios
Características:
  • Avaliadas antes da resposta
  • Podem mudar o estado da transação
  • Meta de desempenho: < 100ms
  • Limitadas a operações leves
Exemplo:
Limite diário excedido → REJEITAR transação

Regras Assíncronas (ASYNC)

Executam em paralelo sem afetar a transação Quando usar:
  • Monitoramento de padrões
  • Análise comportamental
  • Agregações complexas
  • Análise histórica
Características:
  • Não bloqueiam a resposta da API
  • Podem realizar consultas pesadas
  • Geram apenas alertas
  • Alimentam o Dashboard de Inteligência
Exemplo:
Usuário tem 15 transações hoje → Gerar alerta MÉDIO

Estrutura da Regra

{
  "name": "Nome da Regra",
  "category": "fraud|aml|compliance|risk",
  "priority": 100,
  "enabled": true,
  "evaluationMode": "sync|async",
  "targetEntityTypes": ["transaction"],
  "conditions": {
    "operator": "AND|OR",
    "conditions": [...]
  },
  "actions": [...]
}

Campos de Configuração

Campos Básicos

CampoTipoDescrição
namestringNome da regra (único)
categorystringCategoria: fraud, aml, compliance, risk
prioritynumberPrioridade de execução (1-1000, maior = primeiro)
enabledbooleanHabilitar/desabilitar regra
evaluationModestring”sync” ou “async”
targetEntityTypesarrayTipos de entidade para avaliar ([“transaction”])

Condições

As regras usam um sistema flexível de condições:
{
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "amount",
        "operator": "GREATER_THAN",
        "value": 10000
      },
      {
        "field": "currency",
        "operator": "IN",
        "value": ["USD", "EUR", "GBP"]
      }
    ]
  }
}

Operadores de Condição

OperadorDescriçãoExemplo
EQUALSIgualdade exata"type" EQUALS "PAYMENT"
NOT_EQUALSNão igual"status" NOT_EQUALS "blocked"
GREATER_THANMaior que"amount" > 1000
GREATER_THAN_OR_EQUALMaior ou igual"amount" >= 1000
LESS_THANMenor que"amount" < 100
LESS_THAN_OR_EQUALMenor ou igual"amount" <= 100
INNa lista"country" IN ["US", "CA"]
NOT_INNão na lista"country" NOT_IN ["KP", "IR"]
CONTAINSString contém"description" CONTAINS "test"
NOT_CONTAINSString não contém"email" NOT_CONTAINS "@temp"
STARTS_WITHString começa com"accountId" STARTS_WITH "4532"
ENDS_WITHString termina com"domain" ENDS_WITH ".ru"
REGEXCorrespondência regex"email" REGEX "^[a-z]+@"
EXISTSCampo existe"metadata.userId" EXISTS
NOT_EXISTSCampo não existe"referralCode" NOT_EXISTS

Campos de Transação Disponíveis

// Campos Principais
transaction.externalId
transaction.type          // PAYMENT, TRANSFER, WITHDRAWAL, etc.
transaction.amount
transaction.currency
transaction.timestamp

// Referências de Entidades
transaction.originEntityId
transaction.destinationEntityId

// Detalhes de Pagamento
transaction.origin.paymentMethod
transaction.origin.accountType
transaction.destination.paymentMethod

// Dados do Dispositivo
transaction.originDeviceData.ipAddress
transaction.originDeviceData.platform
transaction.originDeviceData.location.country
transaction.originDeviceData.location.city

// MCC e Descrição
transaction.mccCode
transaction.description

// Tags e Metadados
transaction.tags
transaction.metadata.*     // Qualquer campo personalizado

// Campos Computados (disponíveis nas regras)
amountBaseCurrency        // Valor convertido para moeda base
metadata.userTransactionCount30d
metadata.merchantChargebackRate
metadata.deviceFirstSeen
metadata.ipRiskScore

Ações

As regras podem disparar múltiplas ações:

1. Gerar Alerta

{
  "type": "generate_alert",
  "config": {
    "severity": "low|medium|high|critical",
    "type": "custom_alert_type",
    "message": "Descrição do alerta com {{variables}}"
  }
}

2. Definir Decisão (apenas SYNC)

{
  "type": "set_decision",
  "config": {
    "decision": "APPROVE|REJECT|HOLD|REVIEW_REQUIRED|ADDITIONAL_AUTH_REQUIRED",
    "reason": "Motivo da decisão"
  }
}

3. Criar Investigação

{
  "type": "create_investigation",
  "config": {
    "priority": "low|medium|high|critical",
    "assignToTeam": "team_id",
    "assignToUser": "user_id",
    "requiresSAR": true
  }
}

Exemplos de Regras

1. Limite Diário de Transação (SYNC)

{
  "name": "Limite Diário - R$ 10.000",
  "category": "compliance",
  "priority": 950,
  "enabled": true,
  "evaluationMode": "sync",
  "targetEntityTypes": ["transaction"],
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "metadata.userTransactionSum24h",
        "operator": "GREATER_THAN",
        "value": 10000
      },
      {
        "field": "amount",
        "operator": "GREATER_THAN",
        "value": 0
      }
    ]
  },
  "actions": [
    {
      "type": "generate_alert",
      "config": {
        "severity": "high",
        "type": "daily_limit_exceeded",
        "message": "Usuário {{originEntityId}} excedeu limite diário de R$ 10.000"
      }
    },
    {
      "type": "set_decision",
      "config": {
        "decision": "HOLD",
        "reason": "Limite diário de transação excedido"
      }
    }
  ]
}

2. Alerta de Velocidade de Transações (ASYNC)

{
  "name": "Alta Velocidade de Transações",
  "category": "fraud",
  "priority": 800,
  "enabled": true,
  "evaluationMode": "async",
  "targetEntityTypes": ["transaction"],
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "metadata.userTransactionCount1h",
        "operator": "GREATER_THAN",
        "value": 10
      },
      {
        "field": "metadata.userAverageTransactionsPerHour",
        "operator": "LESS_THAN",
        "value": 3
      }
    ]
  },
  "actions": [
    {
      "type": "generate_alert",
      "config": {
        "severity": "medium",
        "type": "velocity_anomaly",
        "message": "Usuário tem {{metadata.userTransactionCount1h}} transações na última hora (média: {{metadata.userAverageTransactionsPerHour}})"
      }
    }
  ]
}

3. Bloqueio de País de Alto Risco (SYNC)

{
  "name": "Bloquear Países de Alto Risco",
  "category": "fraud",
  "priority": 1000,
  "enabled": true,
  "evaluationMode": "sync",
  "targetEntityTypes": ["transaction"],
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "originDeviceData.location.country",
        "operator": "IN",
        "value": ["KP", "IR", "SY"]
      },
      {
        "field": "amount",
        "operator": "GREATER_THAN",
        "value": 100
      }
    ]
  },
  "actions": [
    {
      "type": "generate_alert",
      "config": {
        "severity": "critical",
        "type": "high_risk_country",
        "message": "Transação de país de alto risco: {{originDeviceData.location.country}}"
      }
    },
    {
      "type": "set_decision",
      "config": {
        "decision": "REJECT",
        "reason": "Transação de país sancionado"
      }
    }
  ]
}

4. Detecção de Padrão de Estruturação (ASYNC)

{
  "name": "Possível Estruturação - Limite R$ 10 mil",
  "category": "aml",
  "priority": 900,
  "enabled": true,
  "evaluationMode": "async",
  "targetEntityTypes": ["transaction"],
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "amountBaseCurrency",
        "operator": "GREATER_THAN",
        "value": 9000
      },
      {
        "field": "amountBaseCurrency",
        "operator": "LESS_THAN",
        "value": 10000
      },
      {
        "field": "metadata.userTransactionsSameAmountRange7d",
        "operator": "GREATER_THAN_OR_EQUAL",
        "value": 3
      }
    ]
  },
  "actions": [
    {
      "type": "generate_alert",
      "config": {
        "severity": "high",
        "type": "possible_structuring",
        "message": "Usuário tem {{metadata.userTransactionsSameAmountRange7d}} transações próximas ao limite de R$ 10 mil nos últimos 7 dias"
      }
    },
    {
      "type": "create_investigation",
      "config": {
        "priority": "high",
        "assignToTeam": "aml_compliance",
        "requiresSAR": true
      }
    }
  ]
}

5. Novo Cartão com Valor Alto (SYNC)

{
  "name": "Novo Cartão - Alerta de Valor Alto",
  "category": "fraud",
  "priority": 850,
  "enabled": true,
  "evaluationMode": "sync",
  "targetEntityTypes": ["transaction"],
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "origin.paymentMethod",
        "operator": "EQUALS",
        "value": "CARD"
      },
      {
        "field": "metadata.cardFirstSeen",
        "operator": "LESS_THAN",
        "value": "{{timestamp - 3600}}"
      },
      {
        "field": "amount",
        "operator": "GREATER_THAN",
        "value": 500
      }
    ]
  },
  "actions": [
    {
      "type": "generate_alert",
      "config": {
        "severity": "high",
        "type": "new_card_high_amount",
        "message": "Primeira transação com novo cartão por R$ {{amount}}"
      }
    },
    {
      "type": "set_decision",
      "config": {
        "decision": "ADDITIONAL_AUTH_REQUIRED",
        "reason": "Transação de alto valor com novo cartão - requer 3DS"
      }
    }
  ]
}

6. Padrão de Horário Incomum (ASYNC)

{
  "name": "Transação Fora do Horário Normal",
  "category": "fraud",
  "priority": 700,
  "enabled": true,
  "evaluationMode": "async",
  "targetEntityTypes": ["transaction"],
  "conditions": {
    "operator": "AND",
    "conditions": [
      {
        "field": "metadata.transactionHour",
        "operator": "IN",
        "value": [0, 1, 2, 3, 4, 5]
      },
      {
        "field": "metadata.userNormalHours",
        "operator": "NOT_CONTAINS",
        "value": "{{metadata.transactionHour}}"
      },
      {
        "field": "amount",
        "operator": "GREATER_THAN",
        "value": 1000
      }
    ]
  },
  "actions": [
    {
      "type": "generate_alert",
      "config": {
        "severity": "medium",
        "type": "unusual_time",
        "message": "Transação às {{metadata.transactionHour}}:00 - fora do horário normal do usuário"
      }
    }
  ]
}

Condições Avançadas

Condições Aninhadas

{
  "conditions": {
    "operator": "OR",
    "conditions": [
      {
        "operator": "AND",
        "conditions": [
          {"field": "amount", "operator": "GREATER_THAN", "value": 5000},
          {"field": "type", "operator": "EQUALS", "value": "WITHDRAWAL"}
        ]
      },
      {
        "operator": "AND",
        "conditions": [
          {"field": "amount", "operator": "GREATER_THAN", "value": 10000},
          {"field": "type", "operator": "EQUALS", "value": "TRANSFER"}
        ]
      }
    ]
  }
}

Padrões Regex

{
  "field": "description",
  "operator": "REGEX",
  "value": "^(test|demo|fake).*"
}

Agregações Baseadas em Tempo

{
  "field": "metadata.userTransactionCount",
  "operator": "GREATER_THAN",
  "value": 5,
  "timeWindow": "1h"
}

Melhores Práticas

✅ FAÇA

  1. Use o modo de avaliação apropriado
    • SYNC para decisões que devem bloquear
    • ASYNC para monitoramento e análise
  2. Defina prioridades corretas
    • Bloqueios críticos: 900-1000
    • Verificações padrão: 500-899
    • Monitoramento: 100-499
  3. Inclua mensagens significativas
    • Use variáveis de template: {{field}}
    • Forneça contexto para analistas
    • Inclua métricas relevantes
  4. Teste minuciosamente
    • Comece com modo ASYNC
    • Monitore taxa de falsos positivos
    • Ajuste limites com base em dados
  5. Use campos de metadados
    • Dados agregados para padrões
    • Rastreie comportamento histórico
    • Calcule pontuações de risco

❌ NÃO FAÇA

  1. Não use consultas pesadas em regras SYNC
    • Mantenha regras SYNC rápidas (< 100ms)
    • Mova lógica complexa para ASYNC
  2. Não bloqueie excessivamente
    • Comece com HOLD ao invés de REJECT
    • Permita revisão manual
    • Monitore impacto no cliente
  3. Não crie regras sobrepostas
    • Uma regra deve tratar um padrão
    • Use prioridades corretamente
    • Evite verificações redundantes
  4. Não ignore falsos positivos
    • Rastreie e analise
    • Ajuste limites
    • Use aprendizado de máquina quando disponível

Testando Regras

Modo de Teste

Habilite o modo de teste para avaliar regras sem afetar transações:
{
  "name": "Regra de Teste",
  "enabled": true,
  "testMode": true,
  ...
}

Teste A/B

Crie regras variantes para comparar eficácia:
{
  "name": "Verificação de Fraude - Variante A",
  "variant": "A",
  "percentage": 50,
  ...
}

Métricas de Monitoramento

Rastreie para cada regra:
  • Contagem de execuções: Quantas vezes a regra executa
  • Taxa de correspondência: % de vezes que condições foram atendidas
  • Taxa de falsos positivos: Sinalizados incorretamente
  • Taxa de verdadeiros positivos: Sinalizados corretamente
  • Tempo médio de execução: Desempenho

Próximos Passos