Limites de cashout
O teto de saída é por conta, por operação e por janela. Não é uma regra de
política: pixOut.maxAmount não é mais
avaliado. Quem estoura o teto recebe 422 limit_exceeded_transaction.
Ler o disponível
GET /v1/accounts/{accountId}/limits/available devolve PIX, TED, boleto e
transferência interna, cada um com quatro janelas, usado e restante.
operation é pix_out, ted_out, boleto ou internal_out.
Sem teto efetivo a janela é fail-open: o pagamento não é barrado por limite
local. A precedência do teto é a célula da própria conta, depois o padrão do
tenant, depois o padrão global. source na janela diz qual dos três valeu.
Um teto local de PIX não substitui o teto do liquidante.
GET /v1/accounts/{accountId}/pix/limits está deprecated. Devolve só os
tetos de PIX do liquidante, sem usado, e aponta Link para
/limits/available.
Pedir um aumento
POST /v1/accounts/{accountId}/limit-requests abre um pedido. Não muda o
teto. A CorpX analisa e, ao aprovar, aplica o valor na hora. effectiveAt
fica null enquanto não houver carência.
201:
Nomes da janela
Nesta rota a janela é snake_case. No GET /limits/available o mesmo conceito
é camelCase. Não misture os dois.
requestedLimitBrl tem de ser maior que o teto efetivo daquela janela.
Sem teto, currentLimitBrl é 0 e qualquer valor positivo passa dessa
checagem. Valor igual ou menor é 422 limit_request_not_above_current.
Idempotência
Idempotency-Key é obrigatório (até 128 caracteres) e identifier tem de
ser idêntico ao header. A mesma chave devolve o pedido original com
201, mesmo que o corpo mude. Outra chave, com um pedido ainda em
pending_review para a mesma operação e janela, é 409 limit_request_pending.
Quem pediu e o risco
X-Acting-Document é obrigatório: CPF (11 dígitos) ou CNPJ (14). É o
documento que volta no webhook para você avisar a pessoa certa.
X-Acting-Ip é o IP do operador, não o do seu servidor.
risk é opcional. action é allow, challenge ou deny; score, se
vier, fica entre 0 e 1. O bloco só é armazenado e mostrado ao analista.
deny não recusa o pedido.
justification é obrigatória, até 500 caracteres.
Acompanhar e cancelar
GET /v1/accounts/{accountId}/limit-requests?status= devolve
{ "items": [...] }. status filtra pending_review, approved,
refused ou cancelled. Sem filtro, devolve todos.
GET .../limit-requests/{id} acrescenta decisionMessage, effectiveAt e
events: [{ "at", "status", "message" }]. Só entram eventos públicos. A
nota interna do analista não sai nesta API.
POST .../limit-requests/{id}/cancel cancela só pending_review. Qualquer
outro status é 409 limit_request_closed. O cancelamento também dispara o
webhook.
Status
Não existe estado “aprovado mas ainda não aplicado”.
Webhook limit_request.updated
Sai na aprovação, na recusa e no cancelamento. Não sai na abertura: o 201
já é a confirmação. Assinatura por conta recebe o evento porque accountId
vai no envelope.
data: id, accountId, status, operation, window,
requestedLimitBrl, approvedLimitBrl, decisionMessage, effectiveAt,
actingDocument, identifier.
O exemplo completo está em Webhooks.