Skip to main content
Una validación regresó DENY o REVIEW y alguien pregunta por qué. Esta guía te lleva desde la decisión que devolvió Tracer hasta una regla identificada o un límite de gasto identificado. Desde ahí llega al registro almacenado y a la entrada del que puedes entregar a un auditor meses después. Qué cambia en tu operación: la respuesta a “¿por qué se bloqueó esto?” deja de ser una búsqueda en los registros. Cada decisión llega con los identificadores de lo que la produjo. El mismo registro responde por id años después, y puedes verificar su evento de auditoría 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 oficiales de cumplimiento 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 accesible, con una clave de API. 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 Motor de reglas y Límites de gasto
Todas las llamadas siguientes envían la clave de API como X-API-Key.

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


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

Paso 2: Distinguir un rechazo por regla de un rechazo por límite


Lee reason primero. Indica qué produjo la decisión, y te dice cuál de los dos pasos siguientes debes seguir. reason lleva el mismo texto en las decisiones REVIEW (Rule matched with REVIEW action), y el paso 3 lee una revisión de la misma forma en que lee un rechazo.
En un rechazo por regla, limitUsageDetails regresa 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: Identificar la regla


matchedRuleIds enumera cada regla que coincidió, sin importar la acción que tenga cada una. Una regla DENY y una regla ALLOW pueden aparecer ambas en el mismo rechazo. Recupera cada una y lee su action para encontrar la regla detrás de la decisión:
La regla lleva el name, description, expression, action y scopes que un colega necesita para ver por qué se activó. Consulta Recuperar una regla. Compara matchedRuleIds con evaluatedRuleIds cuando la pregunta es la opuesta: “¿por qué mi regla no se activó?”. Tracer no evaluó una regla que esté ausente de evaluatedRuleIds. Empieza por su estado y su alcance en lugar de su expresión.
Una regla eliminada después de la decisión ya no responde en GET /v1/rules/{id}. Su historial, incluido quién la eliminó, permanece en el registro de auditoría. Consulta Auditoría y cumplimiento.

Paso 4: Identificar el límite de gasto


En un rechazo por limit_exceeded, limitUsageDetails contiene una entrada por cada límite que Tracer verificó, y las entradas marcadas con "exceeded": true son las que el monto superaría:
Lee la entrada superada como la aritmética del rechazo: attemptedAmount contra limitAmount. El campo currentUsage informa lo que el período actual y el alcance coincidente de ese límite contendrían si se incluyera esta transacción. En la entrada anterior, una compra de 1500 llevaría un tope diario de 50000 a 51500. Un límite PER_TRANSACTION no lleva ningún conteo, así que su entrada informa 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 alcance que aplicaban cuando Tracer tomó la decisión. Un límite modificado después no cambia lo que dice el registro. Para saber cómo cuenta cada período y cómo se acumula el consumo, consulta Límites de gasto.

Paso 5: Recuperar el registro más tarde


Tracer almacena cada decisión bajo su validationId:
El registro responde con el contexto de la transacción que Tracer evaluó (transactionType, amount, asset, transactionTimestamp, account, y los campos opcionales segment, portfolio, merchant y metadata), además de los mismos decision, reason, matchedRuleIds, evaluatedRuleIds y limitUsageDetails que llevaba la respuesta original, y un createdAt. Consulta Recuperar una validación. Presenta este registro en una disputa. Contiene la entrada y el resultado en un solo documento. No cambia cuando las reglas o los límites cambian después.

Paso 6: Encontrar registros cuando no tienes el id


GET /v1/validations enumera 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 predeterminada solo cuando faltan tanto start_date como end_date. Envía uno de los dos, o ambos, para llegar a 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 esta regla coincidió
  • exceeded_limit_id={limitId}: cada decisión almacenada que este límite detuvo
Cada resultado es un resumen: validationId, decision, reason, amount, asset, transactionType, accountId, matchedRuleIds, exceededLimitIds, processingTimeMs y createdAt. Toma el validationId del que quieres y recupéralo con el paso 5 para obtener el registro completo. Consulta Listar validaciones para conocer todos los filtros y los campos de paginación.

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


El registro de auditoría almacena la decisión bajo el validationId como el resourceId del evento:
Lo que el evento de auditoría agrega al registro de validación:
La ventana predeterminada 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 quieras cuando la decisión sea más antigua que eso.
El mismo endpoint lleva el ciclo de vida de las reglas y los límites: quién los creó, activó o eliminó. Consulta Listar eventos de auditoría para conocer los filtros, y Auditoría y cumplimiento para los tipos de evento y los períodos de retención.

Paso 8: Verificar 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 nombraste sigue coincidiendo con el hash almacenado junto a él. Cada uno también enlaza con el hash del registro anterior. Dentro de ese tramo, ningún registro fue eliminado, reordenado ni refechado. totalChecked informa cuántos registros cubrió la verificación. En una verificación fallida, isValid es false, message informa manipulación, y firstInvalidId lleva un número de secuencia interno para el 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 contiene 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 regresó 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 rechazó.” El arreglo contiene cada regla que coincidió, sin importar la acción que lleve. Recupera cada regla y lee su action (paso 3).
  • limitUsageDetails está vacío en un rechazo.” La decisión vino de una regla, no de un límite. Lee reason (paso 2).
  • currentUsage es mayor que lo que el cliente realmente gastó.” Ya incluye el monto intentado, así que es una proyección. En un límite superado el contador se mantiene igual, así que el consumo almacenado no incluye esta transacción.
  • “La regla que se activó ya no existe.” Las reglas eliminadas dejan de responder en GET /v1/rules/{id}. Consulta su ciclo de vida mediante GET /v1/audit-events?resource_type=rule&resource_id={ruleId}.

Códigos de error

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

Referencia rápida