Skip to main content
Una validación devolvió DENY o REVIEW y alguien pregunta por qué. Esta guía te lleva desde la decisión que devolvió Tracer hasta una regla con nombre o un límite de gasto con nombre. De ahí llega al registro almacenado y al que puedes entregar a un auditor meses después. Lo que cambia en tu operación: la respuesta a “¿por qué se bloqueó esto?” deja de ser una búsqueda en logs. Cada decisión llega con los identificadores de lo que la produjo. El mismo registro responde por id años después, y su evento de auditoría se puede comprobar contra la cadena de hashes.
¿Para quién es esta guía? Desarrolladores que integran la llamada de validación, equipos de soporte y disputas que responden preguntas de clientes, y responsables de compliance que preparan evidencia. Los pasos 1 a 4 solo necesitan la respuesta que ya tienes; los pasos 5 a 8 usan los endpoints de consulta.

Antes de empezar


  • Tracer en ejecución y alcanzable, con una API key — consulta Primeros pasos
  • Una respuesta DENY o REVIEW con la que trabajar, o el validationId de una
  • Familiaridad con lo que hacen las reglas y los límites — consulta el Motor de reglas y los Límites de gasto
Todas las llamadas de abajo envían la API key como X-API-Key.

Paso 1: Lee la decisión que devolvió Tracer


POST /v1/validations responde con la decisión completa. Una solicitud nueva responde 201; repetir un requestId responde 200 con la decisión que Tracer ya registró para esa clave.
Una denegación producida por una regla se ve así:
Para el esquema completo de solicitud y respuesta, consulta Validar una transacción.
Guarda el validationId junto a tu propio registro de la transacción. Es la clave que toma el Paso 5 y también el resourceId del evento de auditoría en el Paso 7.

Paso 2: Distingue una denegación por regla de una por límite


Lee reason primero. Nombra lo que produjo la decisión y te dice cuál de los dos pasos siguientes tomar. reason lleva el mismo texto en decisiones REVIEWRule matched with REVIEW action — y el Paso 3 lee una revisión igual que lee una denegación.
En una denegación por regla, limitUsageDetails vuelve vacío porque Tracer se detiene antes de la verificación de límites — no porque ningún límite aplique a la cuenta.

Paso 3: Nombra la regla


matchedRuleIds lista cada regla que coincidió, sea cual sea la acción que lleva cada una — una regla DENY y una regla ALLOW pueden aparecer en la misma denegación. Recupera cada una y lee su action para encontrar la regla detrás de la decisión:
La regla lleva el name, la description, la expression, la action y los scopes que un colega necesita para ver por qué disparó — consulta Recuperar una regla. Compara matchedRuleIds con evaluatedRuleIds cuando la pregunta es la opuesta — “¿por qué mi regla no disparó?”. Una regla ausente de evaluatedRuleIds no fue evaluada para esta transacción, así que empieza por su estado y su scope antes que por su expresión.
Una regla eliminada después de la decisión ya no responde en GET /v1/rules/{id}. Su historia, incluido quién la eliminó, queda en el rastro de auditoría — consulta Auditoría y compliance.

Paso 4: Nombra el límite de gasto


En una denegación limit_exceeded, limitUsageDetails tiene una entrada por cada límite que Tracer verificó, y las entradas marcadas con "exceeded": true son las que el monto empujaría más allá de su techo:
Lee la entrada excedida como la aritmética de la denegación: attemptedAmount contra limitAmount, con currentUsage reportando lo que el período actual de ese límite y el scope que coincidió tendrían si esta transacción se permitiera. En la entrada de arriba, una compra de 1500 llevaría un techo diario de 50000 hasta 51500. Un límite PER_TRANSACTION no mantiene conteo, así que su entrada reporta currentUsage como 0 y attemptedAmount contra limitAmount es toda la comparación. GET /v1/limits/{limitId} da el nombre y la configuración actuales del límite — consulta Recuperar un límite. El registro de la decisión conserva el techo, el período y el scope tal como estaban cuando se tomó la decisión, así que un límite cambiado desde entonces no cambia lo que dice el registro. Para cómo cuenta cada período y cómo se acumula el consumo, consulta Límites de gasto.

Paso 5: Recupera el registro más tarde


Cada decisión queda almacenada bajo su validationId:
El registro responde con el contexto de la transacción que Tracer evaluó — transactionType, amount, currency, transactionTimestamp, account y los opcionales segment, portfolio, merchant y metadata — más los mismos decision, reason, matchedRuleIds, evaluatedRuleIds y limitUsageDetails que llevaba la respuesta original, y un createdAt. Consulta Recuperar una validación. Este es el registro para leer en voz alta en una disputa: es la entrada y el resultado en un solo documento, y no cambia cuando las reglas o los límites cambian después.

Paso 6: Encuentra registros cuando no tienes el id


GET /v1/validations lista las decisiones almacenadas, de la más reciente a la más antigua, con paginación por cursor:
Una consulta sin fechas cubre los últimos 90 días, no todo el período de retención. Tracer aplica esa ventana por defecto solo cuando faltan tanto start_date como end_date. Envía una de las dos — o ambas — para alcanzar un rango más antiguo.
Dos filtros responden las preguntas para las que existe esta guía:
  • matched_rule_id={ruleId} — cada decisión almacenada con la que coincidió esta regla
  • exceeded_limit_id={limitId} — cada decisión almacenada que este límite detuvo
Cada resultado es un resumen: validationId, decision, reason, amount, currency, transactionType, accountId, matchedRuleIds, exceededLimitIds, processingTimeMs y createdAt. Toma el validationId del que te interesa y recupéralo con el Paso 5 para tener el registro completo. Consulta Listar validaciones para todos los filtros y los campos de paginación.

Paso 7: Obtén el evento de auditoría detrás de la decisión


El rastro de auditoría registra la decisión con el validationId como resourceId del evento:
Lo que el evento de auditoría agrega al registro de la validación:
La ventana por defecto de 90 días también aplica aquí: GET /v1/audit-events sin start_date ni end_date cubre los últimos 90 días. Envía el rango que quieres cuando la decisión sea más antigua que eso.
El mismo endpoint lleva el ciclo de vida de reglas y límites — quién los creó, activó o eliminó. Consulta Listar eventos de auditoría para los filtros, y Auditoría y compliance para los tipos de evento y los períodos de retención.

Paso 8: Verifica el evento de auditoría en una auditoría


Pasa el eventId al endpoint de verificación:
isValid: true establece que cada registro, desde el primero hasta el que indicaste, sigue coincidiendo con el hash almacenado con él. Cada uno también enlaza con el hash del registro anterior, así que dentro de ese tramo ningún registro fue eliminado, reordenado ni tuvo su fecha alterada. totalChecked reporta cuántos registros cubrió la verificación. En una verificación fallida, isValid es false, message reporta la manipulación y firstInvalidId lleva un número de secuencia interno del registro divergente. Ese número no es un id de evento de auditoría, así que no es un valor para pasar a GET /v1/audit-events/{id}. Consulta Verificar un evento de auditoría.
Entrega los dos juntos: el evento recuperado en el Paso 7 es el contenido de la decisión, y el resultado de la verificación es la evidencia de que la cadena que lo sostiene está intacta. La llamada de verificación informa sobre la cadena — no devuelve el registro.

Errores comunes


Lo que suele salir mal en una revisión:
  • “Mi consulta del año pasado volvió vacía.” Una consulta sin start_date ni end_date cubre los últimos 90 días. Envía el rango que quieres.
  • matchedRuleIds tiene tres entradas y solo una denegó.” El arreglo lleva cada regla que coincidió, sea cual sea la acción que lleva. Recupera cada regla y lee su action (Paso 3).
  • limitUsageDetails está vacío en una denegación.” La decisión vino de una regla, no de un límite. Lee reason (Paso 2).
  • currentUsage es mayor que lo que el cliente gastó de verdad.” Es la cifra proyectada, con el monto intentado ya sumado. En un límite excedido el contador no se incrementó, así que el consumo almacenado no incluye esta transacción.
  • “La regla que disparó ya no existe.” Las reglas eliminadas dejan de responder en GET /v1/rules/{id}. Consulta su ciclo de vida con GET /v1/audit-events?resource_type=rule&resource_id={ruleId}.

Códigos de error

La lista completa está en la lista de errores de Tracer.

Referencia rápida