POST /v1/validations, age de acordo com ALLOW / DENY / REVIEW e segue em frente. O Tracer nunca chama de volta a sua stack. Não há webhooks nem callbacks, e a integração termina com a resposta.
O que muda na sua operação: a decisão deixa de ser lógica em processo e passa a ser uma chamada externa. A chamada é síncrona (requisição/resposta, sem webhooks), então ela fica no caminho crítico da transação. Bem feita, ela adiciona menos de 80ms p99 e te dá um ponto único para política e histórico de validação. Malfeita (sem timeout, sem estratégia de nova tentativa, sem fallback), ela se torna um ponto único de falha.
Trade-off para ser honesto: você está adicionando um salto de rede. A boa notícia é que o contrato é simples: idempotente por requestId, sem callbacks, resposta determinística de três estados. A má notícia é que você deve pensar em timeouts, novas tentativas e o que fazer se o Tracer estiver inacessível. A maior parte deste guia é sobre isso.
Este guia cobre os requisitos de payload, o fluxo de integração e práticas que mantêm a chamada de validação dentro do seu orçamento de latência.
O Tracer fica fora do seu ledger: ele nunca chama o Midaz. Sua aplicação orquestra os dois. Ela chama o Tracer para validar e envia a transação para o Midaz apenas se a decisão for ALLOW. O Tracer avalia suas políticas e limites configurados em relação ao contexto que você envia, não aos saldos das contas. O ledger continua sendo a fonte da verdade para o que uma conta possui.
O Midaz também pode direcionar o Tracer por meio de um seam opcional por ledger. Ele continua sendo unidirecional, Ledger → Tracer. O restante deste guia cobre o padrão HTTP orquestrado pela aplicação. O contrato do seam aparece abaixo.
Visão geral da integração
O Tracer espera chamadas de sistemas de autorização (gateways de pagamento, orquestradores de workflow ou processadores de transação) que precisam de decisões de validação em tempo real. A integração segue um padrão simples de requisição-resposta:
Figura 1. Visão geral da integração com o Tracer
Seam de reserva do Midaz Ledger
Este seam opcional pertence ao Ledger HTTP v2, não ao Tracer HTTP v2. O Ledger HTTP v1 nunca o invoca. A API HTTP pública do Tracer continua sendo apenas v1, incluindo suas operações de reserva em
/v1. O serviço gRPC lerian.midaz.reservation.v1.ReservationService é um transporte interno de serviço para serviço, não uma API v2 pública.
Defina TRACER_BASE_URL para injetar o seam. Quando ela não está definida, o Ledger não faz nenhuma chamada de reserva. O Ledger chama o cliente injetado apenas quando o tracer.mode por ledger é advisory ou enforce. Um modo não definido ou off ainda ignora as reservas mesmo quando você define TRACER_BASE_URL. Um skip por chamada respeitado também contorna o seam.
O gRPC é o transporte padrão: configure TRACER_GRPC_PORT no Tracer e aponte TRACER_BASE_URL para esse listener gRPC. Com TRACER_TRANSPORT=rest, aponte-o para o listener HTTP do Tracer em vez disso. Os dois transportes usam o mesmo serviço de reserva e as mesmas cinco transições:
Para chamadas multi-tenant, o REST encaminha o tenant no header
X-Tenant-Id, e o gRPC o encaminha como metadados x-tenant-id. Nenhum dos dois transportes o coloca na mensagem de reserva.
O listener apenas pode confiar nesse valor via mTLS direto ou atrás de um sidecar service-mesh verificado. Com TRACER_TLS_MODE=mtls, cada lado apresenta e verifica certificados. Os modos de TLS mesh e vazio exigem um sidecar que exija mTLS. Sem um, a conexão entre o processo e o listener é em texto simples, e um chamador não confiável pode falsificar o tenant. O Tracer habilita seu listener gRPC apenas quando você define TRACER_GRPC_PORT.
A semântica de falha é explícita. Uma negação de reserva é uma resposta bem-sucedida, não um erro de transporte. O modo advisory registra o resultado e segue em frente. O modo enforce rejeita a transação antes de qualquer movimentação de saldo, independentemente de failPosture. A configuração failPosture se aplica a qualquer erro de chamada de reserva: closed rejeita e open segue em frente sem uma reserva.
Falhas de confirmação e liberação são operações de nível de aviso, não bloqueantes. O reaper de TTL do Tracer reconcilia uma transição terminal perdida.
Padrão Payload-Complete
O Tracer usa o Padrão Payload-Complete. Cada requisição deve carregar todo o contexto necessário para a validação. Esse design garante:
Suas responsabilidades
Como o sistema que integra, você é responsável por:- Enriquecer o payload com dados de conta, segmento, portfólio e comerciante antes de chamar o Tracer
- Fornecer contexto preciso para a avaliação de regras e limites. O Tracer não pode buscar dados ausentes
- Tratar a decisão (ALLOW, DENY ou REVIEW) de forma adequada no seu workflow
- Implementar a lógica de novas tentativas se o Tracer estiver temporariamente indisponível
- Gerenciar workflows de revisão quando o Tracer retorna
REVIEW. O Tracer não inclui gestão de casos
Responsabilidades do Tracer
O Tracer é responsável por:- Avaliar regras em relação ao contexto fornecido
- Verificar limites em relação ao uso atual
- Armazenar o histórico de validação para investigação e geração de relatórios
- Retornar a decisão com informações detalhadas
Fluxo de integração
Siga estas etapas para integrar seu sistema com o Tracer.
Etapa 1: Preparar o contexto da transação
Antes de chamar o Tracer, reúna todos os dados relevantes dos seus sistemas:Figura 2. Preparando o contexto da transação
Etapa 2: Chamar a API do Tracer
Envie uma requisição POST para/v1/validations com o contexto completo da transação, incluindo:
- Detalhes da transação (tipo, subtipo, valor, ativo, timestamp)
- Informações da conta (obrigatório)
- Opcional: segmento, portfólio, comerciante e personalizados
Etapa 3: Tratar a resposta
Processe a decisão retornada pelo Tracer:
A resposta inclui o
validationId para correlação com o histórico de validação, detalhes sobre quais regras corresponderam e informações sobre o uso atual dos limites.
Usando metadados
Os metadados permitem passar campos personalizados que suas regras podem avaliar. Use isso para contexto como canal, informações do dispositivo, nível do cliente ou qualquer atributo específico do negócio.As chaves de metadados devem ser alfanuméricas com apenas underscores, com no máximo 64 caracteres. Máximo de 50 entradas por requisição.
Idempotência de requisição
As requisições de validação são idempotentes com base no campo
requestId. Se você enviar o mesmo requestId duas vezes, o Tracer retorna o resultado em cache da primeira requisição em vez de reprocessar.
O corpo da resposta é idêntico em ambos os casos. Recomenda-se que seu cliente trate os dois códigos de status como sucesso.
Por que isso importa: timeouts de rede e novas tentativas podem causar requisições duplicadas. Sem idempotência, uma requisição repetida pode contar em dobro contra os limites ou criar registros de validação duplicados. O
requestId garante semântica de processamento exatamente uma vez.
Contrato de idempotência:
- Mesmo
requestId→ Mesma resposta (garantido) requestIddiferente → Processamento independente (mesmo que os dados da transação sejam idênticos)
Autenticação
O Tracer aceita dois modos de autenticação. Você pode usá-los de forma independente ou em conjunto.
Autenticação por chave de API
A opção mais simples. Envie sua chave de API no headerX-API-Key em cada requisição.
Autenticação via plugin (Access Manager)
Para deploys enterprise, o Tracer pode delegar a autenticação ao Lerian Access Manager. Isso permite autenticação centralizada em todos os serviços da Lerian.Prioridade de autenticação
Quando você habilita os dois modos, o Tracer usa esta prioridade:- Se
PLUGIN_AUTH_ENABLED=truee o endpoint não tiver a flag de apenas chave de API → autenticação via plugin - Se
API_KEY_ENABLED=trueou o endpoint carregar a flag de apenas chave de API → autenticação por chave de API
/v1/* documentada nesta referência.
Você pode configurar o endpoint
/v1/validations para autenticação apenas por chave de API via API_KEY_ENABLED_ONLY_VALIDATION=true. Isso é útil em cenários de alta taxa de transferência em que a autenticação via plugin adiciona latência inaceitável. Essa flag é incompatível com o modo multi-tenant (MULTI_TENANT_ENABLED=true). O serviço falha ao iniciar com o código de erro 0458.Autenticação multi-tenant
QuandoMULTI_TENANT_ENABLED=true, o Tracer é executado em modo multi-tenant e o modelo de autenticação muda:
- A autenticação via plugin é obrigatória. O serviço falha ao iniciar com o código de erro
0457sePLUGIN_AUTH_ENABLED=false. - Cada requisição para
/v1/*deve carregar um token bearer JWT emitido pelo Access Manager:Authorization: Bearer <jwt>. tenantIdvem da claim do JWT, não de um header, path, body, metadados ou escopo de regra. Não existe um headerX-Tenant-ID. O identificador do tenant não tem efeito em nenhum outro lugar além da claim do token.- Cada tenant opera no seu próprio banco de dados PostgreSQL. O serviço de plataforma multi-tenancy resolve a conexão específica do tenant no momento da requisição.
- Endpoints públicos (
/health,/readyz,/metrics,/version) continuam sem autenticação também no modo multi-tenant. O requisito de token bearer se aplica apenas a/v1/*.
"code": "Unauthenticated". Chaves de API ausentes retornam o mesmo código, sem um código TRC separado.
Um caso é diferente. Um token que é analisado, mas não carrega a claim sub, retorna HTTP 401 e o código de erro 0474 de imediato. A claim sub é o que o escritor de auditoria usa para atribuir a ação a um principal. O Tracer falha de forma explícita em vez de registrar a mudança contra um ator de sistema genérico. Garanta que seus tokens do Access Manager sempre a carreguem.
Se o deploy multi-tenant atingir seu limite de tenants por instância, as requisições para tenants frios retornam HTTP 503 com o código de erro 0466 e um header Retry-After. Recomenda-se que o cliente aplique backoff e tente novamente. O limite se reajusta automaticamente à medida que o pool LRU remove os tenants frios.
Consulte Multi-tenancy para o modelo de tenant em toda a plataforma.
Considerações de desempenho
Otimize sua integração para baixa latência e alta confiabilidade.
Orçamento de timeout
O Tracer visa uma resposta em menos de 80ms (p99). Configure o timeout do seu cliente de acordo:Estratégia de novas tentativas
Implemente a lógica de novas tentativas para falhas transitórias:Comportamento de fallback
Decida o que acontece quando o Tracer está indisponível:
Sua escolha depende da sua tolerância a risco e dos requisitos do negócio.
Atualidade dos dados
Como você controla o enriquecimento do payload, a atualidade dos dados é sua responsabilidade. O Tracer confia nos dados que você fornece e não pode detectar informações desatualizadas.
Formato de data e hora
Todos os campos de datetime devem usar o formato RFC3339 com fuso horário obrigatório: Formatos válidos:
Checklist de integração
Antes de ir para produção, verifique:
- Sua API Key está em vigor e segura
- Cada requisição inclui um requestId único (UUID)
- O cliente trata as respostas 201 e 200 como sucesso
- O timeout do seu cliente é de 100ms
- Sua lógica de novas tentativas cobre erros 5xx
- Você escolheu um comportamento de fallback
- Seu payload carrega todos os campos obrigatórios
- Os timestamps usam o formato RFC3339 com fuso horário
- Os códigos de ativo estão em ISO 4217 maiúsculo
- Seu sistema trata cada decisão (ALLOW/DENY/REVIEW)
- Seu sistema registra os IDs de validação para correlação com o histórico de validação
Exemplo de integração (pseudocódigo)
Próximos passos
- Motor de regras - Crie regras que avaliam o contexto que você fornece
- Limites de gastos - Configure limites que se aplicam aos escopos das suas transações
- Histórico de validação e compliance - Consulte o histórico de validação e use-o nos seus processos de compliance

