POST /v1/validations, actúa sobre ALLOW / DENY / REVIEW y sigue adelante. Tracer nunca vuelve a llamar a tu stack — no hay webhooks ni callbacks; la integración termina con la respuesta.
Qué cambia en tu operación: la decisión sale de lógica in-process y va a una llamada externa. La llamada es síncrona (request/response, sin webhooks), así que queda en el camino crítico de la transacción. Bien hecha, agrega menos de 80ms p99 y te da un punto único para políticas e historial de validaciones. Mal hecha — sin timeout, sin retry, sin fallback — se vuelve un punto único de falla.
El trade-off honesto: estás agregando un hop de red. La buena noticia es que el contrato es simple: idempotente por requestId, sin callbacks, respuesta determinística de tres estados. La mala noticia es que tienes que pensar en timeouts, retries y qué hacer si Tracer no está disponible — la mayor parte de esta guía es 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 budget de latencia.
Tracer queda fuera de tu ledger: nunca llama a Midaz. Tu aplicación orquesta ambos — llama a Tracer para validar, y solo envía la transacción a Midaz si la decisión es ALLOW. Tracer evalúa tus políticas y límites configurados contra el contexto que envías, no los saldos de las cuentas — el ledger sigue siendo la fuente de verdad de lo que una cuenta tiene.
Midaz también puede accionar 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 se documenta abajo.
Visión general de la integración
Tracer está diseñado para ser llamado por sistemas de autorización (pasarelas de pago, orquestadores de flujo de trabajo 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. Visión general de la integración con Tracer
Seam de reserva del Ledger Midaz
Este seam opt-in pertenece al HTTP v2 de Ledger, no al HTTP v2 de Tracer. El HTTP v1 de Ledger nunca lo invoca. La API HTTP pública de Tracer sigue siendo solo v1, incluidas sus operaciones de reserva bajo
/v1. El servicio gRPC lerian.midaz.reservation.v1.ReservationService es un transporte interno entre servicios, no una API pública v2.
Configura TRACER_BASE_URL para inyectar el seam; cuando no está configurado, el Ledger no hace llamadas de reserva. El cliente inyectado solo se usa cuando el tracer.mode por ledger es advisory o enforce; un modo no configurado u off omite las reservas incluso si TRACER_BASE_URL está configurado. Un skip por llamada autorizado también evita el seam. gRPC es el transporte predeterminado: configura TRACER_GRPC_PORT en Tracer y apunta TRACER_BASE_URL a ese listener gRPC. Con TRACER_TRANSPORT=rest, apúntalo al listener HTTP de Tracer. Ambos transportes usan el mismo servicio de reservas y las mismas cinco transiciones:
En llamadas multi-tenant, REST reenvía el tenant en el header
X-Tenant-Id y gRPC lo reenvía como metadata x-tenant-id; ninguno de los dos transportes lo incluye en el mensaje de reserva. El listener solo puede confiar en este valor con mTLS directo o detrás de un sidecar verificado de service mesh. Con TRACER_TLS_MODE=mtls, cada lado presenta y verifica certificados. Los modos TLS mesh y vacío requieren un sidecar que aplique mTLS; sin él, la conexión entre el proceso y el listener usa texto plano y un caller no confiable puede falsificar el tenant. Tracer activa su listener gRPC solo cuando TRACER_GRPC_PORT está configurado.
La semántica de fallos es explícita. Una denegación de reserva es una respuesta exitosa, no un error de transporte: advisory registra el resultado y continúa, mientras que enforce rechaza la transacción antes de cualquier movimiento de saldo, independientemente de failPosture. failPosture se aplica a cualquier error de la llamada de reserva: closed rechaza y open continúa sin una reserva. Los fallos de confirmación y liberación generan advertencias y no bloquean; el reaper de TTL de Tracer reconcilia una transición terminal perdida.
Patrón Payload-Complete
Tracer utiliza el Patrón Payload-Complete, lo que significa que todo el contexto requerido para la validación debe incluirse en la solicitud. Este diseño asegura:
Tus responsabilidades
Como sistema integrador, 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
- Manejar la decisión (ALLOW, DENY o REVIEW) apropiadamente en tu flujo de trabajo
- Implementar lógica de reintento si Tracer no está disponible temporalmente
- Gestionar flujos de revisión cuando Tracer devuelve
REVIEW—Tracer no incluye gestión de casos
Responsabilidades de Tracer
Tracer es responsable de:- Evaluar reglas contra el contexto proporcionado
- Verificar límites contra el uso actual
- Almacenar el historial de validaciones 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, recopila todos los datos relevantes de tus sistemas:Figura 2. Flujo de integración con Tracer
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 (tipo, subTipo, monto, código de activo, timestamp)
- Información de la cuenta (requerido)
- Opcional: segmento, portafolio, comercio y personalizada
Paso 3: Manejar la respuesta
Procesa la decisión devuelta por Tracer:
La respuesta incluye el
validationId para correlacionar el historial de validaciones, detalles sobre qué reglas coincidieron e información del uso actual del límite.
Usando metadata
Metadata te permite pasar campos personalizados que tus reglas pueden evaluar. Usa esto para contexto como canal, información del dispositivo, nivel del cliente o cualquier atributo específico del negocio.Las claves de metadata deben ser alfanuméricas con guiones bajos solamente, máximo 64 caracteres. Máximo 50 entradas por solicitud.
Idempotencia de solicitudes
Las solicitudes de validación son idempotentes basadas en el campo
requestId. Si envías el mismo requestId dos veces, Tracer devuelve el resultado en caché de la primera solicitud en lugar de procesarla de nuevo.
El cuerpo de la respuesta es idéntico en ambos casos. Tu cliente debe tratar ambos códigos de estado como éxito.
Por qué importa: timeouts de red y reintentos pueden causar solicitudes duplicadas. Sin idempotencia, una solicitud reintentada podría contar doble contra los límites o crear registros de validación duplicados. El
requestId garantiza 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)
Autenticación
Tracer soporta dos modos de autenticación que pueden usarse independientemente o combinados.
Autenticación por API key
La opción más simple. Envía tu API key en el encabezadoX-API-Key en cada solicitud.
Autenticación por plugin (Access Manager)
Para despliegues enterprise, Tracer puede delegar la autenticación al Lerian Access Manager. Esto habilita autenticación centralizada entre todos los servicios Lerian.Prioridad de autenticación
Cuando ambos modos están habilitados, Tracer usa esta prioridad:- Si
PLUGIN_AUTH_ENABLED=truey el endpoint no está marcado para API-key-only → Autenticación por plugin - Si
API_KEY_ENABLED=trueo el endpoint está marcado para API-key-only → Autenticación por API key
/v1/* documentada en esta referencia.
El endpoint
/v1/validations puede configurarse para autenticación solo por API key vía API_KEY_ENABLED_ONLY_VALIDATION=true. Es útil en escenarios de alto throughput donde la autenticación por plugin agrega latencia inaceptable. Esta flag es incompatible con el modo multi-tenant (MULTI_TENANT_ENABLED=true) — el servicio no inicia, fallando con el código de error 0458.Autenticación multi-tenant
CuandoMULTI_TENANT_ENABLED=true, Tracer cambia su modelo de autenticación:
- Plugin auth es obligatorio. El servicio falla al iniciar con el código de error
0457siPLUGIN_AUTH_ENABLED=false. - Toda solicitud
/v1/*debe llevar un JWT bearer token emitido por Access Manager:Authorization: Bearer <jwt>. - El
tenantIdse resuelve a partir del claim del JWT, no de un encabezado, path, body, metadata o alcance de regla. No existe encabezadoX-Tenant-ID— pasar el identificador del tenant en cualquier otro lugar que no sea el claim del token no es soportado y se ignora. - Cada tenant opera en su propia base de datos PostgreSQL. La conexión específica del tenant es resuelta por el servicio de la plataforma de multi-tenancy en el momento de la solicitud.
- Los endpoints públicos (
/health,/readyz,/metrics,/version) permanecen sin autenticación también en modo multi-tenant — el requisito del bearer token aplica solo a/v1/*.
"code": "Unauthenticated" (el mismo código usado cuando falta la API key; no se emite un código TRC separado). Un caso es distinto: un token que se parsea pero no lleva el claim sub se rechaza de entrada con HTTP 401 y el código de error 0474. El claim sub es lo que usa el escritor de auditoría para atribuir la acción a un principal, así que Tracer falla de forma explícita en lugar de registrar el cambio contra un actor de sistema genérico — asegúrate de que tus tokens de Access Manager siempre lo incluyan.
Si el despliegue multi-tenant alcanza su límite de tenants activos por instancia, las solicitudes para tenants fríos retornan HTTP 503 con el código de error 0466 y un encabezado Retry-After. El cliente debe hacer backoff y reintentar; el límite se restablece automáticamente conforme el pool LRU desaloja tenants fríos.
Consulta Multi-tenancy para el modelo de tenants de la plataforma.
Consideraciones de rendimiento
Optimiza tu integración para baja latencia y alta confiabilidad.
Presupuesto de tiempo de espera
Tracer está diseñado para responder en menos de 80ms (p99). Configura el tiempo de espera de tu cliente en consecuencia:Estrategia de reintento
Implementa lógica de reintento para fallos transitorios:Comportamiento de respaldo
Decide qué sucede cuando Tracer no está disponible:
Tu elección depende de tu tolerancia al riesgo y requisitos de negocio.
Frescura de los datos
Dado que tú controlas el enriquecimiento del payload, la frescura de los datos es tu responsabilidad. Tracer confía en los datos que proporcionas y no puede detectar información obsoleta.
Formato de fecha y hora
Todos los campos de fecha y hora deben usar formato RFC3339 con zona horaria obligatoria: Formatos válidos:
Lista de verificación de integración
Antes de ir a producción, verifica:
- API Key está configurada y segura
- Cada transacción nueva genera un
requestIdúnico (UUID); todos sus reintentos reutilizan el mismorequestId - El cliente trata las respuestas 201 y 200 como éxito
- Tiempo de espera del cliente está configurado en 100ms
- Lógica de reintento está implementada para errores 5xx
- Comportamiento de respaldo está definido
- Todos los campos requeridos están poblados
- Las marcas de tiempo usan formato RFC3339 con zona horaria
- Los códigos de activo son mayúsculas ISO 4217
- El manejo de decisiones está implementado (ALLOW/DENY/REVIEW)
- Los IDs de validación se registran para correlacionar el historial de validaciones
Ejemplo de integración (pseudocódigo)
Próximos pasos
- Motor de reglas - Crea reglas que evalúan contra el contexto que proporcionas
- Límites de gasto - Configura límites que se aplican a los alcances de tus transacciones
- Historial de validaciones y cumplimiento - Consulta el historial de validaciones y úsalo en tus procesos de cumplimiento

