Por qué usar el motor de reglas
- Flexibilidad: Crea y modifica reglas sin despliegues de código
- Rendimiento: Las expresiones compiladas se evalúan en menos de 1ms cada una
- Seguridad de tipos: Sintaxis de expresiones validada al crear la regla
- Sin cortocircuito: las reglas coincidentes se evalúan juntas, así el rastro de auditoría registra las reglas que se dispararon, no solo la categoría ganadora
- Basado en alcances: Aplica reglas a segmentos, cuentas o tipos de transacción específicos
- Comprender los conceptos del motor de reglas y el flujo de evaluación
- Crear y probar reglas basadas en expresiones
- Gestionar el ciclo de vida de las reglas (DRAFT, ACTIVE, INACTIVE, DELETED)
- Aplicar mejores prácticas para la gestión de reglas
Qué es el motor de reglas
El motor de reglas es el componente de Tracer responsable de evaluar expresiones durante la validación de transacciones. Permite a los analistas de fraude y gestores de riesgo configurar lógica de negocio que se ejecuta en tiempo real—sin requerir despliegues de código o soporte de ingeniería.
Cómo funciona
Figura 1. Flujo de evaluación del motor de reglas
- Load rules obtiene todas las reglas activas desde la cache (o base de datos si no hay cache)
- Evaluate expressions ejecuta la expresión CEL de cada regla cuyo alcance coincide con la transacción
- Collect matches recopila todas las reglas que coincidieron y determina la decisión
Patrón de evaluación
Las reglas cuyo alcance coincide con la transacción se evalúan juntas. No hay ordenamiento por prioridad ni evaluación de cortocircuito. Esto asegura:- Rastro de auditoría completo (todas las reglas coincidentes se registran)
- Sin pérdida de información (los analistas pueden ver todos los disparadores)
- Lógica simple (sin conflictos de prioridad)
- DENY — cualquier regla
DENYque coincida gana de inmediato. - Límite excedido — si ninguna regla DENY coincide pero algún límite aplicable es excedido, la decisión es DENY (la precedencia de las reglas aplica primero; los límites entran solo cuando ninguna DENY coincidió).
- REVIEW — si ninguna regla DENY coincide y ningún límite es excedido, cualquier regla
REVIEWque coincida gana. - ALLOW — si solo coinciden reglas
ALLOW, la decisión es ALLOW. - Predeterminado — si ninguna regla coincide, Tracer devuelve el
DEFAULT_DECISION_WHEN_NO_MATCHconfigurado (ALLOW, a menos que esté establecido explícitamente comoDENYpara despliegues fail-closed). Solo se aceptanALLOWyDENY;REVIEWno es un valor válido como decisión por defecto, y cualquier otro valor hace fallar el servicio al arrancar.
matchedRuleIds en la respuesta contiene todas las reglas que coincidieron, independientemente de la categoría ganadora, para que los consumidores de auditoría vean todos los disparadores.
Por qué DENY le gana a REVIEW, y REVIEW le gana a ALLOW. La precedencia es fija y no configurable, a propósito: elimina la ambigüedad de “¿cuál regla DENY gana?” en runtime y vuelve trivial la auditoría — la respuesta siempre identifica la acción más estricta que disparó. El costo es que no puedes escribir “reglas ALLOW que sobrescriben DENYs”; si necesitas ese patrón, la respuesta correcta es volver la regla DENY más específica.
Tracer devuelve decisiones; no bloquea transacciones directamente. Tu sistema recibe la decisión y es responsable de tomar la acción apropiada (ej., bloquear, permitir, o enviar a revisión).
Conceptos principales
Antes de crear reglas, comprende los elementos fundamentales.
Reglas
Una regla es una unidad de lógica de negocio compuesta de:- Expression - Una expresión con seguridad de tipos que evalúa a true o false
- Action - Qué decisión devolver cuando la expresión es verdadera
- Scopes - A que transacciones se aplica la regla
- Status - El estado del ciclo de vida de la regla
Expresiones
Las expresiones se escriben en CEL (Common Expression Language), un lenguaje con seguridad de tipos que evalúa el contexto de la transacción y devuelve un valor booleano (true o false). CEL proporciona validación en tiempo de compilación, por lo que los errores de sintaxis se detectan cuando creas la regla—no cuando se están procesando las transacciones. Ejemplos de expresiones:merchant.category es el código MCC ISO 18245 de 4 dígitos — "7995" es el MCC de apuestas/casino. Tanto merchant.category como merchant["category"] son aceptados; los ejemplos en producción usan la notación con corchetes por convención. Si necesitas hacer match con una etiqueta textual como "gambling", guárdala en metadata y haz match por ahí.)
Las expresiones leen la solicitud de validación a través de diez variables. Para los tipos y formatos de campo detrás de cada una, consulta el schema ValidationRequest en la referencia de la API.
Valores de campo que conviene conocer antes de escribir una condición:
account.statusaceptaactive,suspended,closed, yaccount.typeaceptachecking,savings,credit.merchant.categorytoma un código MCC ISO 18245 de 4 dígitos;merchant.countrytoma un código ISO 3166-1 alpha-2.- Esos cuatro campos son opcionales en la solicitud. Un campo que la solicitud omite llega a tu expresión como una cadena vacía, así que una condición que lo compara con un valor específico es falsa.
segment.segmentId,portfolio.portfolioId,account.accountIdymerchant.merchantIdson cadenas UUID.
segmentId y portfolioId están en las variables de primer nivel segment y portfolio, no en account. Para filtrar por segmento, escribe segment.segmentId == "...", no account.segmentId == "...".Una regla que lee un campo de contexto que la solicitud no carga no coincide, y las demás reglas siguen corriendo — así que no necesitas una guarda de presencia para ese caso. Cuando la presencia misma es la condición que buscas, escribe size(segment) > 0 o "risk_score" in metadata.El costo de las expresiones está limitado por
CEL_COST_LIMIT (predeterminado 10000). La comprobación corre en tiempo de compilación — al crear la regla, al actualizar la expresión y de nuevo al activarla —, no solo en la activación: una expresión cuyo costo estimado en el peor caso excede el límite se rechaza con el código de error 0342 (límite de costo excedido) la primera vez que la envías. Los errores de sintaxis aparecen como 0340, los errores de tipo (incluida una expresión que no devuelve un booleano) como 0341, y un fallo al estimar el costo como 0345.Ejemplos de expresiones por caso de uso
Aquí hay ejemplos prácticos organizados por escenario de negocio:Reglas basadas en monto
Reglas basadas en comercio
Reglas basadas en cuenta
Condiciones combinadas
Reglas por horario
Usando metadata
Los campos de metadata son proporcionados por tu integración. Diseña tu payload para incluir el contexto que tus reglas necesitan.
Acciones
Las acciones determinan la decisión cuando una expresión evalúa a true:Alcances
Los alcances definen a qué transacciones se aplica una regla. Una regla sinscopes es global y evalúa contra cualquier transacción. Una regla con uno o más objetos de alcance solo evalúa cuando la transacción coincide con al menos uno de ellos (semántica OR entre objetos de alcance).
Dentro de un único objeto de alcance, los campos soportados son:
segmentId- Coincidir transacciones de un segmento específicoportfolioId- Coincidir transacciones de un portafolio específicoaccountId- Coincidir transacciones de una cuenta específicamerchantId- Coincidir transacciones hacia un comercio específicotransactionType- Coincidir tipos de transacción específicos (CARD, WIRE, PIX, CRYPTO)subType- Coincidir subtipos específicos (debit, credit, instant, etc.)
- Dentro de un objeto de alcance: los campos se combinan con AND. Un campo no especificado funciona como comodín (coincide con cualquier valor). Al menos un campo debe estar definido — objetos de alcance vacíos (
{}) son rechazados con el código de error0358. - Entre múltiples objetos de alcance en la misma regla: se combinan con OR. La regla coincide si cualquier objeto de alcance coincide con la transacción.
transactionType: CARD y otro filtrando transactionType: PIX — se ejecuta tanto para transacciones de tarjeta como para PIX. Un único alcance con segmentId Y accountId requiere que la transacción coincida con el segmento Y con la cuenta.
Ciclo de vida de las reglas
Las reglas progresan a través de un ciclo de vida definido para asegurar un despliegue seguro.
Figura 2. Ciclo de vida y transiciones del motor de reglas
Estados
Transiciones
Las reglas activas deben desactivarse antes de eliminarse. Esto previene la eliminación accidental de reglas que se están evaluando actualmente.
Crear una regla
Crea reglas usando
POST /v1/rules. Las reglas se crean en estado DRAFT por defecto.
Una regla requiere:
- name: Un nombre descriptivo, único dentro de su contexto. El contexto se deriva de los alcances de la regla (el
segmentIdmás bajo entre ellos); las reglas sin alcance comparten un único contexto global. Así, el mismo nombre de regla puede coexistir en dos segmentos distintos, pero no dos veces dentro de uno. La comparación ignora mayúsculas/minúsculas y los espacios repetidos; una colisión devuelve409 Conflictcon el código de error0441. Tracer guarda el nombre en una forma normalizada, así que elnameque devuelve puede diferir de la cadena que enviaste — referencia la regla por elruleIdde la respuesta. - expression: Una expresión CEL que evalúa a true o false
- action: La decisión a devolver cuando la expresión coincide (ALLOW, DENY o REVIEW)
- scopes (opcional): Limita a qué transacciones se aplica la regla
Activar y desactivar reglas
Después de crear una regla, actívala para iniciar la evaluación. Desactiva las reglas para detener la evaluación sin eliminarlas.
Desactivar una regla la preserva para propósitos de auditoría. Usa eliminar solo cuando quieras remover permanentemente una regla.
Listar y consultar reglas
Consulta reglas para gestión y auditoría usando
GET /v1/rules.
Parámetros de consulta
Obtener una regla específica
UsaGET /v1/rules/{id} para recuperar la definición completa de la regla incluyendo expresión y alcances.
Actualizar una regla
Actualiza reglas usando
PATCH /v1/rules/{id}. Las reglas pueden actualizarse en cualquier estado, con una restricción importante:
Eliminar una regla
Elimina las reglas que ya no se necesitan. Solo las reglas DRAFT e INACTIVE pueden eliminarse. Las reglas ACTIVE deben desactivarse primero.
204 No Content
Mejores prácticas
Sigue estas prácticas para reglas efectivas y mantenibles.
Nomenclatura
- Usa nombres descriptivos - El nombre debe indicar claramente qué hace la regla
- Incluye contexto - Menciona el escenario o tipo de transacción
- Evita abreviaturas - Prefiere claridad sobre brevedad
Diseño de expresiones
- Mantén las expresiones simples - La lógica compleja es más difícil de mantener
- Usa alcances para filtrar - No repitas condiciones de alcance en las expresiones
- Prueba casos límite - Considera valores límites y campos nulos
Gestión del ciclo de vida
- Comienza en DRAFT - Prueba antes de activar
- Vuelve a DRAFT antes de editar la expresión - La expresión es inmutable en ACTIVE e INACTIVE; mueve la regla a DRAFT vía
POST /v1/rules/{id}/draftpara editar, después reactívala - Archiva reglas no usadas - Mantiene el rastro de auditoría intacto
- Elimina solo cuando estés seguro - La eliminación es permanente
Monitoreo
- Revisa las reglas coincidentes - Verifica qué reglas se están disparando
- Monitorea las tasas de DENY - Tasas altas de denegación pueden indicar reglas demasiado agresivas
- Audita regularmente - Asegura que las reglas sigan alineadas con los requisitos de negocio
Referencia rápida
Endpoints, acciones e información de estados clave.

