backend/ é o único cliente: ele observa eventos de transação no Kafka, aplica debounce + deduplicação em Redis (TTL 10min para financial, 30min para behavior) e dispara POST /api/v1/scoring/transaction/deposit.
Em versões anteriores existia também um consumer Kafka direto no scoring/ (tópico
atlas.l2.transaction.deposit). Esse caminho foi removido — toda dedup/debounce vive no backend/ para concentrar a lógica de orquestração e evitar duplicação.Dead Letter Queue (output)
A DLQatlas.scoring.dlq continua ativa, mas agora é alimentada apenas pelo producer do scoring/ — quando a publicação do resultado em atlas.l3.user.score falha, o envelope é roteado pra DLQ. Falhas de correlação Camunda retornam HTTP 502 ao caller (backend) e ficam visíveis nos logs do backend/.
Trigger via HTTP
Endpoint
Respostas
202 Accepted:
Schema do Payload de Depósito
Schema completo do eventoDepositEvent para ambos os canais (Kafka e HTTP):
Campos de Identidade e Evento
string
required
Event ID único (UUID v4). Usado como
businessKey para deduplicação no Camunda. Mesmo eid nunca é processado duas vezes.string
required
ID do operador na plataforma Atlas.
string
required
ID da marca dentro da organização.
string
required
Identificador externo do usuário no sistema do operador.
string
required
Sempre
"deposit" para este endpoint.string
required
Timestamp do evento em UTC. Formato:
YYYY-MM-DDTHH:MM:SSZCampos de Perfil do Usuário (PII)
string
Nome do usuário.
string
Sobrenome do usuário.
string
CPF do usuário (formato:
000.000.000-00).string
Data de nascimento. Formato:
YYYY-MM-DDTHH:MM:SSZstring
E-mail do usuário.
string
Telefone com DDD internacional (ex:
+5511999999999).string
Endereço IP da sessão do usuário.
string
País de residência (código ISO 3166-1 alpha-2).
string
Estado (UF para Brasil, ex:
SP).string
Cidade.
string
CEP (formato:
00000-000).string
Gênero:
"M", "F" ou null.string
Status do KYC:
"" (não iniciado), "pending", "approved", "rejected".string
Data de cadastro. Formato:
YYYY-MM-DDTHH:MM:SSZstring
Canal de cadastro:
"web", "mobile_android", "mobile_ios", "api".string
Status da conta:
"ACTIVE", "BLOCKED", etc.boolean
required
Se
true, o evento é descartado silenciosamente pelo consumer sem processamento.Campos da Transação
string
required
ID único da transação no sistema do operador.
number
required
Valor do depósito em BRL. Usado diretamente pelas regras DMN.
number
required
Saldo antes do depósito em BRL.
number
required
Saldo após o depósito em BRL. Deve ser
before_balance + amount.boolean
required
true se este é o primeiro depósito do usuário.string
required
Status da transação:
"RECEIVED", "COMPLETED", etc.string
required
Timestamp da transação em UTC.
Scores de Entrada (sempre zerados)
integer
Sempre
0 na entrada. Preenchido pelo engine.integer
Sempre
0 na entrada.integer
Sempre
0 na entrada.integer
Sempre
0 na entrada.integer
Sempre
0 — módulo futuro.integer
Sempre
0 — módulo futuro.IPS / Contas Vinculadas
object
required
Informações de contas vinculadas detectadas por IP/device.
Histórico de Apostas Esportivas
boolean
required
O usuário fez apostas esportivas no período.
number
required
Volume total de apostas esportivas em BRL.
integer
required
Quantidade de apostas esportivas realizadas.
boolean
required
true se sports_bets_total_amount >= 2000.boolean
required
true se 500 <= sports_bets_total_amount < 2000.boolean
required
true se sports_bets_total_amount < 500.Histórico de Apostas em Cassino
boolean
required
O usuário fez apostas em cassino no período.
number
required
Volume total de apostas em cassino em BRL.
integer
required
Quantidade de rodadas/partidas em cassino.
boolean
required
true se casino_bets_total_amount >= 2000.boolean
required
true se 500 <= casino_bets_total_amount < 2000.boolean
required
true se casino_bets_total_amount < 500.Histórico de Depósitos
boolean
required
Sempre
true para eventos de depósito.number
required
Volume total depositado no período (mês corrente). Usado nas regras
HIGH_MONTHLY_DEPOSIT_VOLUME e ELEVATED_MONTHLY_VOLUME.integer
required
Número de depósitos no período.
boolean
required
true se deposits_total_amount >= 50000.boolean
required
true se 20000 <= deposits_total_amount < 50000.boolean
required
true se deposits_total_amount < 20000.Histórico de Saques
boolean
required
O usuário realizou saques no período.
number
required
Volume total sacado em BRL. Usado para calcular
withdrawalRatio.integer
required
Número de saques realizados.
boolean
required
true se withdrawals_total_amount / deposits_total_amount >= 0.90.boolean
required
true se ratio entre 0.70 e 0.90.boolean
required
true se ratio < 0.70.Histórico de Ganhos
boolean
required
O usuário teve ganhos no período.
number
required
Volume total de ganhos em BRL.
integer
required
Número de eventos de ganho.
boolean
required
true se winnings_total_amount >= 10000.boolean
required
true se 1000 <= winnings_total_amount < 10000.boolean
required
true se winnings_total_amount < 1000.Payload de Exemplo Completo
- Low Risk
- High Risk
Jogador recreativo. Nenhuma regra DMN ativada. Score final esperado: 0.
Testando Localmente
Use o Makefile do móduloscoring/ para publicar os dois perfis de teste: