POST /v1/validations.
Por qué usar límites de gasto
- Protección del cliente: Detecta el gasto excesivo y devuelve decisiones DENY para transacciones grandes no autorizadas
- Gestión de riesgo: Monitorea la exposición por cuenta, segmento o portafolio
- Alcance flexible: Aplica límites en diferentes niveles de granularidad
- Conteo por periodo: Los límites diarios, semanales y mensuales empiezan un conteo nuevo en cada límite de periodo
- Ventanas de tiempo: Restringe la aplicación del límite a horas específicas del día
- Periodos personalizados: Define límites acotados por fecha para campañas, promociones o requisitos de cumplimiento
- Entender los tipos de límite, las ventanas de tiempo y las opciones de alcance
- Crear y configurar límites de gasto con controles basados en periodos
- Monitorear el uso de límites en tiempo real
- Gestionar el ciclo de vida del límite
Conceptos básicos
Entiende los componentes básicos de los límites de gasto.
Tipos de límite
Tracer admite cinco tipos de límites de gasto:Hora de reinicio
resetTime mueve el inicio de cada periodo DAILY, WEEKLY y MONTHLY a otra hora del día, en formato HH:MM (24 horas, UTC). Sin él, cada periodo empieza a las 00:00 UTC. Defínelo al crear el límite. No puedes cambiarlo después.
Tracer rechaza resetTime en un límite CUSTOM o PER_TRANSACTION con el código de error 0537. Cuando el límite tiene una ventana de tiempo, resetTime no debe caer dentro de la ventana. Puede ser igual a activeTimeStart o activeTimeEnd. Una hora de reinicio dentro de la ventana devuelve el código de error 0538.
Ventanas de tiempo
Las ventanas de tiempo restringen cuándo Tracer aplica un límite durante el día. Cuando una transacción ocurre fuera de la ventana de tiempo configurada, Tracer omite el límite y no lo aplica. La transacción continúa sin contar contra ese límite.- Formato:
HH:MM(24 horas, UTC) - Ambos campos son obligatorios: Si defines
activeTimeStart, también debes definiractiveTimeEnd(y viceversa) - Intervalo semiabierto: El inicio es inclusivo, el fin es exclusivo
[start, end) - Se admiten ventanas nocturnas: Definir
activeTimeStart: "20:00"yactiveTimeEnd: "06:00"crea una ventana de 8 PM a 6 AM UTC
Puedes aplicar ventanas de tiempo a cualquier tipo de límite (DAILY, WEEKLY, MONTHLY, CUSTOM o PER_TRANSACTION). Sin una ventana de tiempo, el límite está activo 24/7.
limitType:DAILYmaxAmount:"1000.00"activeTimeStart:"23:00"activeTimeEnd:"09:00"resetTime:"09:00"- Alcance: transacciones Pix
resetTime: "09:00" inicia cada conteo diario cuando la ventana cierra. Sin él, el conteo se reinicia a las 00:00 UTC (21:00 en Brasilia), en medio de la ventana. Un cliente puede entonces gastar los R$ 1,000 completos antes de las 21:00 hora de Brasilia y otra vez después.
Periodos personalizados
Los periodos personalizados definen un rango de fechas durante el cual un límite está activo. Esto es útil para campañas, promociones, eventos estacionales o requisitos de cumplimiento con límites de fecha específicos.- Campos obligatorios:
customStartDateycustomEndDate(solo para el tipoCUSTOM) - Intervalo semiabierto: El inicio es inclusivo, el fin es exclusivo
[start, end) - Duración máxima: 5 años
- No puede estar en el pasado:
customEndDateno debe ser completamente anterior a la fecha actual
limitType:CUSTOMmaxAmount:"100000.00"customStartDate:"2026-11-25T00:00:00Z"customEndDate:"2026-11-30T00:00:00Z"- Alcance: transacciones CARD en el segmento minorista
customEndDate, Tracer deja de verificar el límite.
Combinar ventanas de tiempo y periodos personalizados
Puedes usar ventanas de tiempo y periodos personalizados juntos en límitesCUSTOM. Tracer verifica entonces una transacción contra el límite solo cuando esta cae dentro tanto del periodo personalizado como de la ventana de tiempo.
Por ejemplo, toma un límite CUSTOM con customStartDate del 25 de noviembre a customEndDate del 30 de noviembre y una ventana de tiempo de 09:00 a 18:00. Tracer aplica ese límite solo durante el horario laboral dentro del periodo de Black Friday.
Alcances
Los alcances definen a qué transacciones se aplica un límite. A diferencia de las reglas, todo límite debe tener al menos un objeto de alcance. Los límites no pueden ser globales. Dentro de un solo objeto de alcance, los campos admitidos son:segmentId- Aplica a transacciones de un segmento específicoportfolioId- Aplica a transacciones de un portafolio específicoaccountId- Aplica a transacciones de una cuenta específicamerchantId- Aplica a transacciones hacia un comercio específicoscheme- Aplica a un esquema de pago, comoCARDoPIX.transactionTypees el nombre obsoleto de este camposubType- Aplica a un subtipo de transacción específico (por ejemplo,debit,credit)
- Dentro de un objeto de alcance: los campos se combinan con AND. Un campo que omites funciona como comodín (coincide con cualquier valor). Debes definir al menos un campo. Tracer rechaza los objetos de alcance vacíos (
{}) con el código de error0009. - Entre varios objetos de alcance del mismo límite: se combinan con OR. El límite se aplica si cualquier objeto de alcance coincide con la transacción.
DENY o cuando la solicitud usa POST /v1/validations/rules-only.
Seguimiento de uso
Para límitesDAILY, WEEKLY, MONTHLY y CUSTOM, Tracer mantiene un contador de uso por límite, por alcance coincidente, por periodo. La decisión de validación reporta ese contador. Consulta Leer el consumo.
Para contadores DAILY, WEEKLY y MONTHLY, expiresAt es 90 días después del reinicio del periodo. Para contadores CUSTOM, es 90 días después de customEndDate. Los contadores vencidos son elegibles para limpieza. La eliminación física requiere un proceso de limpieza habilitado que se ejecute correctamente.
Cómo funcionan los límites
Tracer evalúa los límites durante solicitudes de validación.
Flujo de verificación de límites
Figura 1. Cómo funcionan los límites de gasto
- Buscar límites - Consulta todos los límites activos que coincidan con el alcance de la transacción
- Verificar la ventana de tiempo - Si el límite tiene una ventana de tiempo configurada, verifica que la hora actual del servidor caiga dentro de
activeTimeStart/activeTimeEnd. Si está fuera, Tracer omite el límite (aquí no usa eltransactionTimestampprovisto por el cliente) - Verificar el periodo personalizado - Si el límite es
CUSTOM, verifica que la hora actual del servidor caiga dentro decustomStartDate/customEndDate. Si está fuera, Tracer omite el límite (de nuevo, no usatransactionTimestamp) - Calcular el uso proyectado - Suma el monto de la transacción al uso actual
- Comparar contra el umbral - Verifica si el uso proyectado supera el monto del límite
- Devolver el resultado - Si la transacción supera cualquier límite aplicable, o si alguna regla DENY coincide, Tracer devuelve una decisión DENY (tu sistema debe entonces bloquear la transacción)
Las verificaciones de límites y los incrementos de contadores son transaccionales. Si Tracer deniega una transacción (por límites o reglas) o la marca para revisión, revierte todos los incrementos de contadores de forma atómica. Esto evita fugas de límite por operaciones parciales.
Cuando Tracer omite un límite durante la evaluación,
limitUsageDetails[i] incluye skipped: true y un campo skipReason con uno de dos valores:"outside_time_window": la hora actual del servidor está fuera de la ventanaactiveTimeStart/activeTimeEnddel límite"outside_custom_period": la hora actual del servidor está fuera del rangocustomStartDate/customEndDatedel límite
transactionTimestamp provisto por el cliente, para evitar ataques de manipulación de marca de tiempo.Por qué la hora del servidor en lugar de
transactionTimestamp. El cliente puede definir transactionTimestamp con cualquier valor que quiera. Eso incluye un valor construido para caer dentro de una ventana activa cuando la transacción real caería fuera de ella. Si Tracer confiara en el reloj del cliente para aplicar las ventanas de tiempo, cualquiera con acceso al payload podría evadir los límites fuera de horario. Fijar la verificación de la ventana al propio reloj de Tracer elimina esa superficie de ataque. La desventaja es que una pequeña desviación de reloj entre los pods de Tracer puede causar omisiones en casos límite cerca del borde de la ventana.Escenario de ejemplo
Un segmento corporativo tiene un límite diario de R$ 50,000 ("50000.00") para transacciones CARD.
Si el uso actual es de R 8,000:
- Uso proyectado: R 8,000 = R$ 53,000
- Límite: R$ 50,000
- Resultado: Tracer devuelve una decisión DENY (tu sistema debe bloquear la transacción)
Crear un límite
Crea límites usando
POST /v1/limits. Tracer crea los límites en estado DRAFT de forma predeterminada.
Un límite requiere:
- name: Un nombre descriptivo (por ejemplo, “Daily Corporate Card Limit”)
- limitType: DAILY, WEEKLY, MONTHLY, CUSTOM o PER_TRANSACTION
- maxAmount: Monto máximo como valor decimal (por ejemplo,
"50000.00"). No puede ser negativo. UnmaxAmountde0deniega todas las transacciones en el alcance del límite. - asset: Código de activo de 1 a 100 letras mayúsculas (por ejemplo, BRL, USD)
- scopes: Al menos un alcance para definir a qué transacciones se aplica
- activeTimeStart: Inicio de la ventana de tiempo diaria en formato
HH:MM(por ejemplo,"09:00") - activeTimeEnd: Fin de la ventana de tiempo diaria en formato
HH:MM(por ejemplo,"17:00") - customStartDate: Fecha de inicio para límites
CUSTOM(marca de tiempo ISO 8601, obligatoria para CUSTOM) - customEndDate: Fecha de fin para límites
CUSTOM(marca de tiempo ISO 8601, obligatoria para CUSTOM) - resetTime: Inicio de cada periodo
DAILY,WEEKLYoMONTHLYen formatoHH:MM(por ejemplo,"09:00")
Los nombres de límites deben ser únicos entre tus límites no eliminados, a diferencia de los nombres de reglas, que son únicos solo dentro de su contexto de alcance. Tracer aplica la unicidad sobre el nombre exactamente como está almacenado, después de recortar los espacios en blanco al inicio y al final. La comparación es sensible a mayúsculas y minúsculas y no colapsa los espacios en blanco dentro del nombre, así que
Daily Card Limit y daily card limit son dos límites distintos, ambos aceptables. Eliminar un límite libera su nombre para reutilizarlo. Una colisión devuelve 409 Conflict con el código de error 0442.Listar y consultar límites
Consulta límites para gestión y auditoría usando
GET /v1/limits.
Parámetros de consulta
Obtener un límite específico
UsaGET /v1/limits/{id} para obtener la definición completa del límite, incluidos los alcances y el estado actual.
Leer el consumo
Desde la decisión
Cada respuesta correcta dePOST /v1/validations, 201 o 200, incluye limitUsageDetails. Cada entrada reporta:
- limitId y limitAmount: qué tope verificó Tracer, y su techo
- currentUsage: el consumo proyectado del periodo actual de ese tope y del alcance coincidente si Tracer permite esta transacción. Incluye la capacidad que retienen las reservas no confirmadas del ledger de Midaz. Para un límite
PER_TRANSACTION, o un límite que Tracer omitió, es0 - attemptedAmount: el monto verificado contra el tope
- exceeded: si el monto intentado empujaría este tope más allá de su techo. Tracer evalúa cada tope, así que más de una entrada puede llevar
exceeded: true, y cualquiera de ellas produce el DENY
Desde el límite
GET /v1/limits/{id}/usage reporta el periodo actual del límite. Su currentUsage es lo que consumió el alcance más usado en ese periodo, incluida la capacidad que retienen las reservas no confirmadas del ledger de Midaz. Para un límite PER_TRANSACTION, es 0.
Para un límite con un maxAmount de 0, utilizationPercent es 100 y nearLimit es true.
Actualizar un límite
Actualiza límites usando
PATCH /v1/limits/{id}. Los campos limitType, asset y resetTime son inmutables. No puedes cambiarlos después de la creación.
Ciclo de vida del límite
Los límites siguen el mismo ciclo de vida que las reglas:
Figura 2. Ciclo de vida de los límites de gasto
Estados
Transiciones
Mejores prácticas
Recomendaciones para una gestión eficaz de los límites.
Nomenclatura
- Sé descriptivo - Incluye el alcance y el tipo en el nombre
- Usa patrones consistentes - por ejemplo, “Daily Limit”
Diseño de alcances
- Empieza amplio y refina según sea necesario - Empieza con límites de nivel de segmento y agrega el nivel de cuenta para excepciones
- Evita alcances superpuestos - Varios límites sobre el mismo alcance pueden generar confusión
- Usa esquemas de pago - Diferentes métodos de pago pueden necesitar límites distintos
Diseño de ventanas de tiempo
- Úsalas para cumplimiento regulatorio - Los límites nocturnos de Pix exigidos por BACEN son un caso de uso común
- Considera el impacto de la zona horaria - Las ventanas de tiempo usan UTC. Ten en cuenta el desfase de la zona horaria local de tus usuarios
- Combínalas con periodos personalizados - Usa ventanas de tiempo dentro de periodos personalizados para controles de campaña precisos
Monitoreo
- Revisa las transacciones denegadas - Tasas altas de denegación pueden indicar que los límites son demasiado restrictivos
- Ajusta según la temporada - Considera aumentos temporales de límites durante periodos de gasto alto, o usa límites
CUSTOMpara rangos de fechas específicos
Referencia rápida
Endpoints clave y opciones de configuración.
Endpoints
Para las definiciones de tipos de límite (DAILY, WEEKLY, MONTHLY, CUSTOM, PER_TRANSACTION), consulta Tipos de límite más arriba en esta guía. La misma guía cubre los campos opcionales de ventana de tiempo y periodo personalizado, y la lista completa de campos de alcance. La referencia de la API tiene los detalles de nivel de esquema.

