POST /v1/validations.
Por que usar limites de gastos
- Proteção ao cliente: detecta gastos excessivos e retorna decisões DENY para transações grandes não autorizadas
- Gestão de risco: monitora a exposição por conta, segmento ou portfólio
- Escopo flexível: aplica limites em diferentes níveis de granularidade
- Rastreamento em tempo real: cada decisão reporta quanto de cada teto consumiu
- Contagem por período: limites diários, semanais e mensais começam uma nova contagem a cada fronteira de período
- Janelas de tempo: restringe a aplicação do limite a horas específicas do dia
- Períodos personalizados: define limites com datas fixas para campanhas, promoções ou exigências de compliance
- Entender tipos de limite, janelas de tempo e opções de escopo
- Criar e configurar limites de gastos com controles baseados em período
- Monitorar o uso de limites em tempo real
- Gerenciar o ciclo de vida do limite
Conceitos básicos
Entenda os blocos de construção dos limites de gastos.
Tipos de limite
O Tracer aceita cinco tipos de limites de gastos:Janelas de tempo
Janelas de tempo restringem quando o Tracer aplica um limite durante o dia. Quando uma transação ocorre fora da janela de tempo configurada, o Tracer pula o limite e não o aplica. A transação prossegue sem contar contra esse limite.- Formato:
HH:MM(24 horas, UTC) - Os dois campos são obrigatórios: se você define
activeTimeStart, deve definir tambémactiveTimeEnd(e vice-versa) - Intervalo semiaberto: o início é inclusivo, o fim é exclusivo
[start, end) - Janelas noturnas aceitas: definir
activeTimeStart: "20:00"eactiveTimeEnd: "06:00"cria uma janela das 8 da noite às 6 da manhã, UTC
Você pode aplicar janelas de tempo a qualquer tipo de limite (DAILY, WEEKLY, MONTHLY, CUSTOM ou PER_TRANSACTION). Sem uma janela de tempo, o limite fica ativo 24/7.
limitType:DAILYmaxAmount:"1000.00"activeTimeStart:"20:00"activeTimeEnd:"06:00"- Escopo: transações Pix
Períodos personalizados
Períodos personalizados definem um intervalo de datas durante o qual um limite fica ativo. Isso é útil para campanhas, promoções, eventos sazonais ou exigências de compliance com fronteiras de data específicas.- Campos obrigatórios:
customStartDateecustomEndDate(apenas para o tipoCUSTOM) - Intervalo semiaberto: o início é inclusivo, o fim é exclusivo
[start, end) - Duração máxima: 5 anos
- Não pode estar no passado:
customEndDatenão deve estar inteiramente antes da data atual
limitType:CUSTOMmaxAmount:"100000.00"customStartDate:"2026-11-25T00:00:00Z"customEndDate:"2026-11-30T00:00:00Z"- Escopo: transações CARD no segmento de varejo
customEndDate, o Tracer para de conferir o limite.
Combinando janelas de tempo e períodos personalizados
Você pode usar janelas de tempo e períodos personalizados juntos em limitesCUSTOM. O Tracer então confere uma transação contra o limite apenas quando ela cai dentro tanto do período personalizado quanto da janela de tempo.
Por exemplo, tome um limite CUSTOM com customStartDate de 25 de novembro a customEndDate de 30 de novembro e uma janela de tempo de 09:00 a 18:00. O Tracer aplica esse limite apenas durante o horário comercial dentro do período da Black Friday.
Escopos
Escopos definem a quais transações um limite se aplica. Diferente das regras, todo limite deve ter pelo menos um objeto de escopo. Limites não podem ser globais. Dentro de um único objeto de escopo, os campos aceitos são:segmentId: aplica-se a transações de um segmento específicoportfolioId: aplica-se a transações de um portfólio específicoaccountId: aplica-se a transações de uma conta específicamerchantId: aplica-se a transações para um comerciante específicotransactionType: aplica-se a tipos de transação específicos (CARD, WIRE, PIX, CRYPTO)subType: aplica-se a um subtipo de transação específico (por exemplo,debit,credit)
- Dentro de um objeto de escopo: os campos se combinam com AND. Um campo que você omite funciona como curinga (corresponde a qualquer valor). Você deve definir pelo menos um campo. O Tracer rejeita objetos de escopo vazios (
{}) com o código de erro0009. - Entre vários objetos de escopo no mesmo limite: eles se combinam com OR. O limite se aplica se qualquer objeto de escopo corresponder à transação.
Rastreamento de uso
Para limitesDAILY, WEEKLY, MONTHLY e CUSTOM, o Tracer mantém um contador de uso por limite, por escopo correspondido, por período. A decisão de validação reporta esse contador. Veja Ler o consumo.
O Tracer mantém um contador por 90 dias após o fim do seu período, e então um worker em segundo plano o exclui.
Como os limites funcionam
O Tracer avalia limites durante toda requisição de validação.
Fluxo de conferência de limite
Quando o Tracer valida uma transação, ele confere todos os limites aplicáveis:Figura 1. Como funcionam os limites de gastos
- Encontrar limites: consulta todos os limites ativos que correspondem ao escopo da transação
- Conferir a janela de tempo: se o limite tem uma janela de tempo configurada, verifica se o horário atual do servidor cai dentro de
activeTimeStart/activeTimeEnd. Se estiver fora, o Tracer pula o limite (ele não usa otransactionTimestampfornecido pelo cliente aqui) - Conferir o período personalizado: se o limite é
CUSTOM, verifica se o horário atual do servidor cai dentro decustomStartDate/customEndDate. Se estiver fora, o Tracer pula o limite (de novo, não usatransactionTimestamp) - Calcular o uso projetado: soma o valor da transação ao uso atual
- Comparar com o limite: verifica se o uso projetado excede o valor do limite
- Retornar o resultado: se a transação excede qualquer limite aplicável, ou qualquer regra DENY corresponde, o Tracer retorna uma decisão DENY (seu sistema deve então bloquear a transação)
As conferências de limite e os incrementos de contador são transacionais. Se o Tracer nega uma transação (por limites ou regras) ou a sinaliza para revisão, ele reverte todos os incrementos de contador de forma atômica. Isso evita vazamento de limite por operações parciais.
Quando um limite é pulado durante a avaliação,
limitUsageDetails[i] inclui skipped: true e um campo skipReason com um de dois valores:"outside_time_window": o horário atual do servidor está fora da janelaactiveTimeStart/activeTimeEnddo limite"outside_custom_period": o horário atual do servidor está fora do intervalocustomStartDate/customEndDatedo limite
transactionTimestamp fornecido pelo cliente, para evitar ataques de manipulação de timestamp.Por que o horário do servidor em vez do
transactionTimestamp. O cliente pode definir transactionTimestamp como quiser. Isso inclui um valor forjado para cair dentro de uma janela ativa quando a transação real cairia fora dela. Se o Tracer confiasse no relógio do cliente para aplicar a janela de tempo, qualquer um com acesso ao payload poderia contornar limites de horário restrito. Fixar a conferência da janela no próprio relógio do Tracer elimina essa superfície de ataque. A desvantagem é que uma pequena variação de relógio entre pods do Tracer pode causar pulos em casos extremos perto da fronteira da janela. Na prática, os relógios do Tracer, sincronizados por NTP, mantêm essa variação em milissegundos de um único dígito.Cenário de exemplo
Um segmento corporativo tem um limite diário de R$ 50.000 ("50000.00") para transações CARD.
Se o uso atual é R 8.000:
- Uso projetado: R 8.000 = R$ 53.000
- Limite: R$ 50.000
- Resultado: o Tracer retorna a decisão DENY (seu sistema deve bloquear a transação)
Criar um limite
Crie limites usando
POST /v1/limits. Por padrão, o Tracer cria limites com status DRAFT.
Um limite requer:
- name: um nome descritivo (por exemplo, “Daily Corporate Card Limit”)
- limitType: DAILY, WEEKLY, MONTHLY, CUSTOM ou PER_TRANSACTION
- maxAmount: valor máximo como um valor decimal (por exemplo,
"50000.00") - asset: código de ativo ISO 4217 (por exemplo, BRL, USD)
- scopes: pelo menos um escopo para definir a quais transações se aplica
- activeTimeStart: início da janela de tempo diária no formato
HH:MM(por exemplo,"09:00") - activeTimeEnd: fim da janela de tempo diária no formato
HH:MM(por exemplo,"17:00") - customStartDate: data de início para limites
CUSTOM(timestamp ISO 8601, obrigatório para CUSTOM) - customEndDate: data de fim para limites
CUSTOM(timestamp ISO 8601, obrigatório para CUSTOM)
Os nomes de limite devem ser globalmente únicos entre todos os limites não excluídos, diferente dos nomes de regra, que são únicos apenas dentro do contexto do seu escopo. O Tracer aplica a unicidade sobre o nome exatamente como armazenado, depois de remover espaços em branco do início e do fim. A comparação diferencia maiúsculas de minúsculas e não condensa espaços em branco dentro do nome, então
Daily Card Limit e daily card limit são dois limites distintos, ambos aceitáveis. Excluir um limite libera o nome para reutilização. Uma colisão retorna 409 Conflict com o código de erro 0442.Listar e consultar limites
Consulte limites para gestão e auditoria usando
GET /v1/limits.
Parâmetros de consulta
Obter um limite específico
UseGET /v1/limits/{id} para obter a definição completa do limite, incluindo escopos e status atual.
Ler o consumo
A partir da decisão
Toda resposta dePOST /v1/validations carrega limitUsageDetails, com uma entrada para cada limite que o Tracer conferiu. Cada entrada reporta:
- limitId e limitAmount: qual teto o Tracer conferiu, e seu valor máximo
- currentUsage: o consumo projetado do período atual e do escopo correspondido desse teto, se o Tracer permitir esta transação
- attemptedAmount: o valor conferido contra o teto
- exceeded: se o valor tentado levaria este teto a ultrapassar seu valor máximo. O Tracer avalia todo teto, então mais de uma entrada pode carregar
exceeded: true, e qualquer uma delas produz o DENY
A partir do limite
GET /v1/limits/{id}/usage reporta um total acumulado. Seu currentUsage soma os contadores de uso registrados para o limite, entre períodos e escopos. Use-o para revisar o consumo geral de um limite, não para responder quanto resta a um cliente no período atual.
O Tracer exclui um contador 90 dias após o fim do seu período (veja Rastreamento de uso). Em um limite de longa duração, esse total cobre apenas os períodos ainda retidos, não o ciclo de vida completo do limite.
Atualizar um limite
Atualize limites usando
PATCH /v1/limits/{id}. Os campos limitType e asset são imutáveis. Você não pode alterá-los após a criação.
Ciclo de vida do limite
Limites seguem o mesmo ciclo de vida das regras:
Figura 2. Ciclo de vida dos limites de gastos
Estados
Transições
Boas práticas
Recomendações para uma gestão eficaz de limites.
Nomenclatura
- Seja descritivo: inclua o escopo e o tipo no nome
- Use padrões consistentes: por exemplo, “Daily Limit”
Design de escopo
- Comece amplo, refine conforme necessário: comece com limites de nível de segmento, adicione nível de conta para exceções
- Evite escopos sobrepostos: vários limites no mesmo escopo podem gerar confusão
- Use tipos de transação: métodos de pagamento diferentes podem precisar de limites diferentes
Design de janela de tempo
- Use para compliance regulatório: os limites noturnos de Pix do BACEN são um caso de uso comum
- Considere o impacto do fuso horário: janelas de tempo usam UTC. Leve em conta o deslocamento do fuso horário local dos seus usuários
- Combine com períodos personalizados: use janelas de tempo dentro de períodos personalizados para controles precisos de campanha
Monitoramento
- Leia o payload da decisão:
limitUsageDetailsmostra quanto de cada teto cada transação consumiu - Revise as transações negadas: taxas altas de negação podem indicar que os limites estão restritivos demais
- Ajuste sazonalmente: considere aumentos temporários de limite durante períodos de gasto alto, ou use limites
CUSTOMpara intervalos de data específicos
Referência rápida
Principais endpoints e opções de configuração.
Endpoints
Para as definições de tipo de limite (DAILY, WEEKLY, MONTHLY, CUSTOM, PER_TRANSACTION), veja Tipos de limite anteriormente neste guia. O mesmo guia cobre os campos opcionais de janela de tempo e de período personalizado e a lista completa de campos de escopo. A referência da API tem detalhes em nível de esquema.

