POST /v1/validations, actúa según ALLOW / DENY / REVIEW y continúa. Tracer nunca vuelve a entrar en tu stack. No hay webhooks ni callbacks, y la integración termina con la respuesta.
Qué cambia en tu operación: la toma de decisiones pasa de una lógica en proceso a una llamada externa. La llamada es síncrona (solicitud/respuesta, sin webhooks), así que queda en la ruta crítica de la transacción. Bien implementada, agrega menos de 80ms p99 y te da un punto único para las políticas y el historial de validación. Mal implementada (sin timeout, sin estrategia de reintento, sin fallback), se convierte en un punto único de falla.
Trade-off: agregas un salto de red. El contrato es simple: idempotente por requestId, sin callbacks, respuesta determinista de tres estados. Debes pensar en los timeouts, los reintentos y qué hacer si Tracer es inaccesible. La mayor parte de esta guía trata sobre eso.
Esta guía cubre los requisitos del payload, el flujo de integración y las prácticas que mantienen la llamada de validación dentro de tu presupuesto de latencia.
Tracer se ubica fuera de tu ledger: nunca llama a Midaz. Tu aplicación orquesta ambos. Llama a Tracer para validar y envía la transacción a Midaz solo si la decisión es ALLOW. Tracer evalúa tus políticas y límites configurados contra el contexto que envías, no contra los saldos de las cuentas. El ledger sigue siendo la fuente de verdad de lo que tiene una cuenta.
Midaz también puede llamar a Tracer mediante un seam de reserva opcional por ledger. Sigue siendo unidireccional, Ledger → Tracer. El resto de esta guía cubre el patrón HTTP orquestado por la aplicación. El contrato del seam aparece más abajo.
Resumen de la integración
Tracer espera llamadas de sistemas de autorización (gateways de pago, orquestadores de workflow o procesadores de transacciones) que necesitan decisiones de validación en tiempo real. La integración sigue un patrón simple de solicitud-respuesta:
Figura 1. Resumen de la integración con Tracer
Seam de reserva de Midaz Ledger
Este seam opcional pertenece a Ledger HTTP v2. Ledger HTTP v1 nunca lo invoca. La API HTTP pública de Tracer es solo v1 y no tiene operaciones de reserva. Ledger llama al servicio gRPC
lerian.midaz.reservation.v1.ReservationService. Este servicio es un transporte interno de servicio a servicio, no una API pública.
Tracer siempre inicia este listener gRPC, en el puerto 4021 de forma predeterminada. Para usar otro puerto, define TRACER_GRPC_PORT con una dirección de escucha en el formato :4021.
En Ledger, define TRACER_BASE_URL con la dirección del listener en el formato host:port. Cuando TRACER_BASE_URL no está definida, Ledger no hace ninguna llamada de reserva. Ledger llama a Tracer solo cuando el tracer.mode por ledger es advisory o enforce. Un modo no definido o off omite las reservas incluso cuando defines TRACER_BASE_URL. Un skip por llamada respetado también evita el seam.
El seam tiene cinco transiciones:
Orden de despliegue
Despliega Tracer antes de desplegar el Ledger de la misma versión de Midaz. Un Tracer anterior a v4.3.0 acepta solo los esquemasCARD, WIRE, PIX y CRYPTO. Rechaza una reserva con cualquier otro esquema. En modo enforce, el Ledger entonces rechaza la transacción con 0532.
Un Tracer anterior a v4.3.0 tampoco puede leer una validación almacenada con cualquier otro esquema. Esto incluye un pod al que el despliegue gradual todavía no llegó. Después de que Tracer almacene una validación así, no regreses Tracer a una versión anterior a v4.3.0.
Mientras se ejecute un Ledger de v4.2.0 o posterior, no regreses Tracer a una versión anterior a v4.2.0. Un Tracer anterior descarta el tipo de cuenta, los metadatos y el indicador de reversión de cada solicitud de reserva.
Reglas en una reserva
En cadaReserve, Tracer evalúa primero tus reglas activas, con el mismo evaluador que POST /v1/validations. Después reserva capacidad de límite. En una reserva, el valor predeterminado sin coincidencia no se aplica. Cuando ninguna regla coincide, la reserva continúa con la verificación de límites. Una reserva de reversión omite las reglas y aun así reserva capacidad de límite.
La solicitud de reserva lleva el monto, el activo, el esquema de pago de la transacción, el timestamp de la transacción y los valores escalares de metadatos, como strings. También lleva el ID y el tipo de la primera cuenta de origen, y los ID del segmento y del portafolio de esa cuenta. No lleva merchant ni el nombre del segmento o del portafolio. Una reserva de reversión lleva el esquema de la transacción original.
Los límites y las reglas con alcance por segmento, portafolio o esquema se aplican a la reserva. Una reserva sin esquema coincide solo con alcances que no indican esquema.
Resultados en Ledger
Una denegación de reserva es una respuesta exitosa, no un error de transporte. El modoadvisory nunca bloquea la transacción. El modo enforce rechaza la transacción antes de cualquier movimiento de saldo:
Con la postura abierta, Ledger también continúa sin verificaciones de reglas ni de límites cuando Tracer rechaza las credenciales de Ledger.
Ledger también puede devolver
0536 para una reserva. La lista de errores de Midaz describe cada código.
Las fallas de confirmación y liberación no bloquean la transacción.
Patrón Payload-Complete
Tracer usa el Patrón Payload-Complete. Cada solicitud debe llevar todo el contexto necesario para la validación. Este diseño garantiza:
Tus responsabilidades
Como sistema que se integra, eres responsable de:- Enriquecer el payload con datos de cuenta, segmento, portafolio y comercio antes de llamar a Tracer
- Proporcionar contexto preciso para la evaluación de reglas y límites. Tracer no puede obtener datos faltantes
- Gestionar la decisión (ALLOW, DENY o REVIEW) de forma adecuada en tu workflow
- Implementar lógica de reintento si Tracer no está disponible temporalmente
- Gestionar los workflows de revisión cuando Tracer devuelve
REVIEW. Tracer no incluye gestión de casos
Responsabilidades de Tracer
Tracer es responsable de:- Evaluar las reglas según el contexto proporcionado
- Verificar los límites según el uso actual
- Almacenar el historial de validación para investigación e informes
- Devolver la decisión con información detallada
Flujo de integración
Sigue estos pasos para integrar tu sistema con Tracer.
Paso 1: Preparar el contexto de la transacción
Antes de llamar a Tracer, reúne todos los datos relevantes de tus sistemas:Figura 2. Preparación del contexto de la transacción
Paso 2: Llamar a la API de Tracer
Envía una solicitud POST a/v1/validations con el contexto completo de la transacción, incluyendo:
- Detalles de la transacción (scheme, subType, amount, asset, timestamp)
- Información de la cuenta (obligatorio)
- Opcional: segmento, portafolio, comercio y personalizados
Paso 3: Gestionar la respuesta
Procesa la decisión que devuelve Tracer:
La respuesta incluye el
validationId para correlacionar con el historial de validación, detalles sobre qué reglas coincidieron e información sobre el uso actual de los límites.
Uso de metadatos
Los metadatos permiten pasar campos personalizados que tus reglas pueden evaluar. Úsalos para contexto como el canal, la información del dispositivo, el nivel del cliente o cualquier atributo específico del negocio.Las claves de metadatos deben ser alfanuméricas, con guiones bajos como único carácter adicional permitido, y un máximo de 64 caracteres. Máximo de 50 entradas por solicitud.
Idempotencia de la solicitud
Las solicitudes de validación son idempotentes según el campo
requestId. Si envías el mismo requestId dos veces, Tracer devuelve el resultado en caché de la primera solicitud en lugar de reprocesarla.
El cuerpo de la respuesta es idéntico en ambos casos. Se recomienda que tu cliente trate ambos códigos de estado como éxito.
Los timeouts de red y los reintentos pueden causar solicitudes duplicadas. Sin idempotencia, una solicitud reintentada podría contarse dos veces contra los límites o crear registros de validación duplicados. El
requestId garantiza una semántica de procesamiento exactamente una vez.
Contrato de idempotencia:
- Mismo
requestId→ Misma respuesta (garantizado) requestIddiferente → Procesamiento independiente (incluso si los datos de la transacción son idénticos)
Validación solo por reglas
POST /v1/validations/rules-only recibe la misma solicitud que POST /v1/validations y devuelve la misma respuesta y los mismos errores. Tracer decide solo por tus reglas y no verifica ni cuenta ningún límite de gasto. Usa esta ruta para evaluar un crédito entrante sin consumir un límite.
Las dos rutas comparten un único espacio de requestId. Un requestId ya usado en cualquiera de las dos rutas devuelve la decisión registrada para él, así que nunca reutilices un requestId entre las dos rutas.
Tracer almacena una validación solo por reglas como cualquier otra. Aparece en GET /v1/validations y en las cifras del dashboard. Solo la instantánea de la solicitud en su evento de auditoría la marca, con rulesOnly: true.
Autenticación
Tracer admite dos modos de autenticación. Puedes usarlos de forma independiente o juntos.
Autenticación por clave de API
La opción más simple. Envía tu clave de API en el headerX-API-Key con cada solicitud.
Autenticación por plugin (Access Manager)
Tracer puede delegar la autenticación al Lerian Access Manager. Esto permite la autenticación centralizada en todos los servicios de Lerian.Prioridad de autenticación
Cuando habilitas ambos modos, Tracer usa esta prioridad:- Si
PLUGIN_AUTH_ENABLED=truey el endpoint no tiene la flag de solo clave de API → autenticación por plugin - Si
API_KEY_ENABLED=trueo el endpoint lleva la flag de solo clave de API → autenticación por clave de API
/v1/* documentada en esta referencia.
Puedes configurar
POST /v1/validations y POST /v1/validations/rules-only para autenticación de solo clave de API mediante API_KEY_ENABLED_ONLY_VALIDATION=true. Esas rutas verifican entonces la clave de API solo cuando API_KEY_ENABLED=true. Esto resulta útil en escenarios de alto rendimiento donde la autenticación por plugin agrega una latencia inaceptable.Autenticación en Lerian Cloud
En Lerian Cloud, la autenticación funciona así:- Cada solicitud a
/v1/*debe llevar un token bearer JWT emitido por Access Manager:Authorization: Bearer <jwt>. tenantIdproviene del claim del JWT, no de un header, path, body, metadatos o alcance de regla. No existe un headerX-Tenant-ID. El identificador del tenant no tiene efecto en ningún otro lugar más allá del claim del token.
sub devuelve HTTP 401 y el código de error 0474 de inmediato. El claim sub es lo que el escritor de auditoría usa para atribuir la acción a un principal. Tracer falla de forma explícita en lugar de registrar el cambio contra un actor de sistema genérico. Confirma que tus tokens de Access Manager siempre lo lleven.
Si el servicio está temporalmente al límite de capacidad para tu tenant, las solicitudes devuelven HTTP 503 con el código de error 0466 y un header Retry-After. Aplica backoff y reintenta.
Consideraciones de rendimiento
Optimiza tu integración para baja latencia y alta confiabilidad.
Presupuesto de timeout
Tracer apunta a responder en menos de 80ms (p99). Configura el timeout de tu cliente en consecuencia:Estrategia de reintento
Implementa lógica de reintento para fallas transitorias:Comportamiento de fallback
Decide qué sucede cuando Tracer no está disponible:
Tu elección depende de tu tolerancia al riesgo y de los requisitos del negocio.
Actualidad de los datos
Como tú controlas el enriquecimiento del payload, la actualidad de los datos es tu responsabilidad. Tracer confía en los datos que proporcionas y no puede detectar información desactualizada.
Formato de fecha y hora
Todos los campos de fecha y hora deben usar el formato RFC3339 con zona horaria obligatoria: Formatos válidos:
Lista de verificación de integración
Antes de pasar a producción, verifica lo siguiente:
- Tu clave de API está lista y protegida
- Cada solicitud incluye un requestId único (UUID)
- El cliente trata las respuestas 201 y 200 como éxito
- El timeout de tu cliente es de 100ms
- Tu lógica de reintento cubre los errores 5xx
- Elegiste un comportamiento de fallback
- Tu payload lleva todos los campos obligatorios
- Los timestamps usan el formato RFC3339 con zona horaria
- Los códigos de activo tienen de 1 a 100 letras mayúsculas
- Tu sistema gestiona cada decisión (ALLOW/DENY/REVIEW)
- Tu sistema registra los IDs de validación para correlacionarlos con el historial de validación
Ejemplo de integración (pseudocódigo)
Próximos pasos
- Motor de reglas - Crea reglas que evalúen el contexto que proporcionas
- Límites de gasto - Configura límites que se apliquen a los alcances de tus transacciones
- Historial de validación y compliance - Consulta el historial de validación y úsalo en tus procesos de compliance

