DENY ou REVIEW e alguém pergunta o motivo. Este guia leva você da decisão que o Tracer retornou até uma regra nomeada ou um limite de gastos nomeado. A partir daí, você chega ao registro armazenado e ao evento da que pode entregar a um auditor meses depois.
O que muda na sua operação: a resposta para “por que isso foi bloqueado?” deixa de ser uma busca em log. Cada decisão chega com os identificadores do que a produziu. O mesmo registro responde pelo id anos depois, e você pode conferir seu evento de auditoria contra a cadeia de hash.
Antes de começar
- Tracer em execução e acessível, com uma chave de API. Veja Primeiros passos
- Uma resposta
DENYouREVIEWpara trabalhar, ou ovalidationIdde uma delas - Familiaridade com o que regras e limites fazem. Veja o Motor de regras e Limites de gastos
X-API-Key.
Passo 1: Leia a decisão que o Tracer retornou
POST /v1/validations responde com a decisão completa. Uma nova requisição responde 201. Um requestId repetido responde 200 com a decisão que o Tracer já havia registrado para essa chave.
Para o schema completo de requisição e resposta, veja Validar uma transação.
Passo 2: Diferencie uma negativa de regra de uma negativa de limite
Leia
reason primeiro. Ele nomeia o que produziu a decisão, e diz qual dos dois próximos passos seguir.
reason traz o mesmo texto em decisões REVIEW (Rule matched with REVIEW action), e o Passo 3 lê uma revisão do mesmo jeito que lê uma negativa.
Em uma negativa de regra,
limitUsageDetails volta vazio porque o Tracer para antes da verificação de limite, não porque nenhum limite se aplica à conta.Passo 3: Nomeie a regra
matchedRuleIds lista toda regra que combinou, qualquer que seja a ação que cada uma carregue. Uma regra DENY e uma regra ALLOW podem aparecer juntas na mesma negativa. Recupere cada uma e leia sua action para encontrar a regra por trás da decisão:
name, description, expression, action e scopes que um colega precisa ver para entender por que ela disparou. Veja Recuperar uma regra.
Compare matchedRuleIds com evaluatedRuleIds quando a pergunta for a oposta: “por que minha regra não disparou?”. O Tracer não avaliou uma regra que está ausente de evaluatedRuleIds. Comece pelo status e pelo escopo dela, em vez da expressão.
Passo 4: Nomeie o limite de gastos
Em uma negativa
limit_exceeded, limitUsageDetails guarda uma entrada por limite que o Tracer verificou, e as entradas marcadas "exceeded": true são as que o valor levaria além do teto:
attemptedAmount contra limitAmount. O campo currentUsage reporta o que o período atual e o escopo combinado desse limite conteriam com esta transação incluída. No exemplo acima, uma compra de 1500 levaria um teto diário de 50000 a 51500.
Um limite PER_TRANSACTION não mantém contagem, então sua entrada reporta currentUsage como 0, e attemptedAmount contra limitAmount é toda a comparação.
GET /v1/limits/{limitId} retorna o nome e a configuração atuais do limite. Veja Recuperar um limite. O registro da decisão guarda o teto, o período e o escopo que se aplicavam quando o Tracer tomou a decisão. Um limite alterado depois disso não muda o que o registro diz.
Para como cada período conta e como o consumo acumula, veja Limites de gastos.
Passo 5: Recupere o registro depois
O Tracer armazena toda decisão sob seu
validationId:
transactionType, amount, asset, transactionTimestamp, account, e os campos opcionais segment, portfolio, merchant e metadata), além dos mesmos decision, reason, matchedRuleIds, evaluatedRuleIds e limitUsageDetails que a resposta original carregava, e um createdAt. Veja Recuperar uma validação.
Leia este registro em uma disputa. Ele guarda a entrada e o resultado em um único documento. Ele não muda quando regras ou limites mudam depois.
Passo 6: Encontre registros quando você não tem o id
GET /v1/validations lista decisões armazenadas, da mais recente para a mais antiga, com paginação por cursor:
matched_rule_id={ruleId}: toda decisão armazenada com a qual esta regra combinouexceeded_limit_id={limitId}: toda decisão armazenada que este limite bloqueou
validationId, decision, reason, amount, asset, transactionType, accountId, matchedRuleIds, exceededLimitIds, processingTimeMs e createdAt. Pegue o validationId do que você quer e recupere-o com o Passo 5 para o registro completo. Veja Listar validações para todo filtro e os campos de paginação.
Passo 7: Extraia o evento de auditoria por trás da decisão
A trilha de auditoria registra a decisão sob o
validationId como o resourceId do evento:
O mesmo endpoint carrega o ciclo de vida de regras e limites: quem os criou, ativou ou excluiu. Veja Listar eventos de auditoria para os filtros, e Auditoria e compliance para os tipos de evento e os períodos de retenção.
Passo 8: Verifique o evento de auditoria em uma auditoria
Passe o
eventId para o endpoint de verificação:
isValid: true estabelece que todo registro do primeiro até o que você nomeou ainda corresponde ao hash armazenado com ele. Cada um também se liga ao hash do registro anterior a ele. Dentro desse intervalo, nenhum registro foi removido, reordenado ou teve a data alterada. totalChecked reporta quantos registros a verificação cobriu.
Em uma verificação com falha, isValid é false, message reporta adulteração, e firstInvalidId carrega um número de sequência interno para o registro divergente. Esse número não é um id de evento de auditoria, então não é um valor para passar a GET /v1/audit-events/{id}.
Veja Verificar um evento de auditoria.
Entregue os dois juntos: o evento recuperado no Passo 7 é o conteúdo da decisão, e o resultado da verificação é a evidência de que a cadeia que o guarda está íntegra. A chamada de verificação reporta sobre a cadeia. Ela não retorna o registro.
Armadilhas comuns
Códigos de erro
A lista completa está na lista de erros do Tracer.

