Guia de PIX em lote
O PIX em lote resolve o caso em que você tem uma planilha — folha de
pagamento, repasse a fornecedores, comissões, reembolsos — e quer pagar tudo de
uma vez sem escrever um loop de POST /pix/out. Você sobe as linhas, a API
confere chaves, duplicidades, saldo e limites antes de qualquer débito, e
só depois do seu aceite explícito cada linha vira um PIX out comum, com os
mesmos limites, políticas, webhooks e lançamentos no extrato de
PIX Out.
Use o lote quando as linhas já existem juntas (um arquivo, um fechamento) e
você quer um resumo para aprovar e um relatório único no fim. Use
POST /pix/out quando o pagamento nasce de um evento isolado e precisa de
resposta síncrona. Os dois caminhos geram o mesmo PIX e os mesmos webhooks
pix.out.*.
Como funciona
Três decisões de desenho que valem para toda a superfície:
- Somente API (M2M). As rotas exigem credencial com escopo
pix_out.create(ouapi2/writelegado). Token de usuário humano não cria nem dispara lote; o Portal e o Internet Banking não expõem essa superfície. Uma credencial só-leitura (read) consegue acompanhar lotes (GET), baixar o modelo e comprovantes, mas não cria, edita nem dispara. - Habilitação em dois níveis. A CorpX liga a feature
pix_batchno tenant e a seçãopixBatch.enabled = truena policy da conta. Sem a primeira a API responde403 feature_disabled; sem a segunda,403 pix_batch_account_disabled. Peça a ativação ao seu gerente de conta informando as contas que vão operar em lote. - Nada sai sem conferência e aceite. O dispatch exige lote
REVIEWED, zero itens inválidos, saldo suficiente eacknowledged: trueno corpo. O resumo da conferência existe para ser mostrado a quem aprova.
Pré-requisitos
Início rápido
Cinco chamadas levam um arquivo do zero ao pagamento. Nos exemplos,
$BASE é https://tenant.api.corpx.com/v1/accounts/{accountId} e os
cabeçalhos Authorization: Bearer $TOKEN e X-Tenant-Id estão implícitos.
Rotas
Todas sob /v1/accounts/{accountId}/pix/batches. A coluna Escopo indica
o que a credencial precisa ter; read acompanha, pix_out.create opera.
A referência campo a campo está em Referência da API → PIX em lote.
1. O arquivo
GET .../pix/batches/template devolve pix-lote-modelo.csv: UTF-8 com BOM e
separador ;, que o Excel em português abre direto. O conteúdo é exatamente
este:
Cada linha é um PIX e preenche um dos dois blocos de destinatário:
- O cabeçalho é casado por nome, sem importar ordem ou caixa; colunas que você não usa podem ficar vazias ou ser omitidas.
;e,são detectados automaticamente; aspas seguem o padrão CSV.- As colunas
errorCodeeerrorMessagedo arquivo de correção são ignoradas na entrada: o arquivo exportado sobe de volta como está. - Linha com
pixKeye dados bancários ao mesmo tempo é rejeitada — escolha um modo por linha.
2. Criar o lote
Idempotency-Key(até 128 caracteres) é obrigatório; repetir a mesma chave na mesma conta devolve o lote existente com200em vez de criar outro. Use algo que identifique o fechamento (folha-2026-09), não um UUID aleatório — assim um retry do seu lado nunca abre lote duplicado.nameé opcional (até 120 caracteres) e aparece nas listagens e noresumo.csvdos comprovantes.
Resposta 201:
limits.maxItems é o tamanho máximo deste lote nesta conta e
limits.source diz de onde veio (default = 50, tenant ou account,
até 5.000). Valores monetários são sempre strings decimais com duas
casas ("1436.85"), nunca números de ponto flutuante.
3. Enviar os itens
Você pode misturar os dois métodos no mesmo lote, em quantas chamadas
precisar, enquanto o lote estiver DRAFT ou REVIEWED.
CSV
JSON
O corpo é o arquivo cru (até 5 MiB; acima disso 413). O upload é
atômico: se uma linha estiver inválida a resposta é
400 pix_batch_csv_invalid com a lista de problemas e nada é salvo.
line conta a partir do cabeçalho = linha 1, então 3 é a segunda linha de
dados — igual ao que o Excel mostra. Um arquivo com mais linhas que
limits.maxItems é 400 pix_batch_too_large.
Regras comuns aos dois métodos
- Idempotência por linha. Repetir um
identifiercom o mesmo conteúdo é ignorado (não duplica, não dá erro). Repetir com conteúdo diferente é409 pix_batch_item_conflicte a chamada inteira é recusada — corrija o arquivo em vez de contar com sobrescrita. - Remover.
DELETE .../items/{itemId}tira um item; oitemId(pxi_…) vem emitems[]do lote. - Estados editáveis. Só
DRAFTeREVIEWEDaceitam itens ou remoção. Qualquer alteração num loteREVIEWEDo devolve aDRAFTe zera a conferência: você precisa revisar de novo antes de disparar. EmREVIEWINGou depois do dispatch,409 pix_batch_not_editable. - Tamanho. O total de itens do lote nunca passa de
limits.maxItems; a chamada que estouraria o teto é recusada inteira com400 pix_batch_too_large.
4. Conferir (review)
A conferência é assíncrona e roda antes de qualquer débito. Repetir o
POST enquanto está REVIEWING só devolve o estado atual. Por item, nesta
ordem:
No modo chave o DICT resolve nome, documento e banco do recebedor, que
passam a aparecer em items[].receiver — é o que você mostra para quem
aprova. As consultas usam o cache de 24 h da conta e contam na janela de
consultas DICT como GET /pix/key/{pixKey}; leia
Consultas de chave PIX antes de conferir
milhares de chaves novas. Itens em dados bancários são aceitos como enviados;
a validação da conta destino acontece no liquidante, na execução.
Acompanhe com GET .../pix/batches/{batchId}. Quando status vira
REVIEWED, review traz o resumo:
balanceelimitssão um retrato do momento. O saldo é checado de novo no dispatch e cada PIX passa pelos limites por janela na execução.limits[].windowédaily_out(6h–20h) ounightly_out(20h–6h) conforme a hora da conferência, maismonthly;enforced: falsesignifica que a conta não tem teto configurado naquela janela.balance.checked: falsequer dizer que o liquidante não respondeu; o aviso vai parawarnings[]e não bloqueia.warnings[]não bloqueia o aceite (ex.: saldo insuficiente agora — pode entrar dinheiro até o dispatch). ItensINVALIDbloqueiam.- Se a conferência não conseguir rodar, o lote volta a
DRAFTereviewtraz um campoerror; basta chamarreviewde novo.
Um item reprovado fica assim em items[]:
Para corrigir, baixe só as linhas reprovadas, ajuste e suba de novo (o
identifier igual com conteúdo novo é recusado — remova o item antes com
DELETE, ou use um identifier novo), depois confira outra vez:
5. Disparar (dispatch)
acknowledged: true é a declaração de que o resumo da conferência foi lido e
aprovado — grave do seu lado quem aprovou e quando. Sem ele a API responde
409 pix_batch_acknowledgement_required. O dispatch ainda exige, nesta
ordem:
- Lote
REVIEWED(409 pix_batch_not_reviewed). - Ao menos um item (
409 pix_batch_empty) e total dentro delimits.maxItems(400 pix_batch_too_large). - Nenhum item
INVALIDe todos conferidos (409 pix_batch_has_invalid_items/409 pix_batch_not_reviewed). - Saldo disponível maior ou igual ao total do lote no momento do
dispatch (
422 pix_batch_insufficient_balance— nada é iniciado).
O dispatch é uma rota de cash out: valem as travas de saída da conta, o PIN
transacional e os cabeçalhos X-Acting-Document / X-Transaction-Pin /
X-Acting-Ip exatamente como em POST /pix/out (ver
Segurança da conta). Os
cabeçalhos só são necessários se a conta tiver PIN ou travas configurados.
Depois do 202 não há cancelamento: os itens já em voo seguem até
liquidar ou falhar.
Resposta 202 com status: QUEUED e dispatchedAt. Repetir o dispatch de
um lote já disparado é idempotente (200 com o estado atual), então um
retry por timeout de rede é seguro.
6. Acompanhar
Cada item vira um PixOut.Workflow próprio — o mesmo que atende
POST /pix/out — com identifier igual ao da linha e idempotência
{batchId}_{itemId}. Ele passa pelas mesmas políticas, limites por janela e
registro no extrato de um PIX avulso, e emite os mesmos
pix.out.completed, pix.out.failed ou pix.out.timeout. O lote paga até
5 itens em paralelo (configuração CorpX) e só avança quando o liquidante
responde; um item lento não trava os demais.
Estados do lote
Estados do item
GET .../pix/batches/{batchId} traz statistics e os itens paginados
(page, pageSize até 200), filtráveis por status
(pending, processing, completed, failed) e reviewStatus
(pending, ok, invalid):
Webhook de fechamento
Ao final a API envia pix.batch.completed. Ele é o fechamento do lote e
não substitui os eventos por item: para reconciliar linha a linha use
pix.out.completed / pix.out.failed (o identifier do evento é o da sua
linha) ou a lista de itens.
Assine com authType: HMAC, valide X-Signature sobre os bytes brutos e
deduplique pelo id — detalhes em Webhooks.
Prefira reagir a pix.batch.completed. Se precisar de polling (uma barra de
progresso, por exemplo), consulte GET .../pix/batches/{batchId} a cada
10–30 s e leia só status e statistics; não liste os itens a cada ciclo.
7. Corrigir e reenviar
Devolve, no mesmo formato do modelo, só as linhas que falharam na
execução ou foram marcadas inválidas na conferência, com duas colunas a mais
no fim: errorCode e errorMessage. O cabeçalho X-Total-Rows diz quantas
linhas vieram.
Corrija e suba o arquivo como está em um novo lote — o parser ignora
as colunas de erro. Um identifier que falhou pode ser reutilizado; um que
liquidou não (a conferência o apontaria como identifier_conflict), o que
protege contra pagar duas vezes a mesma linha.
separator=comma troca ; por , para ferramentas em inglês.
8. Comprovantes
Os comprovantes são PDFs no padrão CorpX (logo do tenant quando configurada,
pagador, recebedor com documento mascarado, valor, descrição, identifier,
endToEndId, data de liquidação em horário de Brasília).
Um item — resposta direta em application/pdf, só para itens
COMPLETED (409 pix_batch_receipt_unavailable):
Lote inteiro — para lotes encerrados (COMPLETED, PARTIAL_FAILED ou
FAILED com ao menos um item liquidado; senão 409 pix_batch_no_receipts):
O ZIP é gerado em segundo plano. Chame a rota em download: enquanto o job
roda ela responde 409 not_ready; quando termina, devolve downloadUrl
pré-assinada (válida por expiresIn segundos) e checksumMd5. O arquivo
traz um PDF por item liquidado e um resumo.csv com as colunas linha,
identificador, destinatario, valor, endToEnd, data, arquivo e
erro (preenchida só se algum PDF não pôde ser gerado).
Os PDFs seguem o padrão
{AAAA-MM-DD}_{HHMM}_PIX_{valor}_{destinatario}_{identifier}_{endToEnd}.pdf
— por exemplo
2026-09-30_1312_PIX_1436-85_JOAO-ANTONIO-DA-CONCEICAO_folha-set-001_E5087192120260930131200abcdef0123.pdf
— sem acentos e com sufixo -2, -3… em caso de colisão.
Boas práticas
- Uma
Idempotency-Keypor fechamento.folha-2026-09,fornecedores-2026-09-30… Assim um retry da criação nunca abre um segundo lote, e você consegue reencontrar o lote pelo seu próprio calendário. identifierdeterminístico e único por linha. Monte-o a partir dos seus dados ({folha}-{matricula}), nunca de um contador em memória. É ele que liga o PIX ao seu sistema no extrato, nos webhooks e no arquivo de correção — e é ele que impede pagar a mesma linha duas vezes.- Confira sempre antes de pedir aprovação. Mostre
review(totais, saldo, limites, inválidos) a quem aprova e só então envieacknowledged: true. Guarde quem aprovou, quando e oreviewedAtque estava na tela. - Separe quem monta de quem dispara. Uma credencial
readpode acompanhar; só a credencial compix_out.createdispara. Se a conta usa PIN transacional, o dispatch exige o PIN do operador que aprova. - Trate
PARTIAL_FAILEDcomo rotina, não exceção. Chaves excluídas e contas encerradas acontecem em qualquer folha grande. Baixeitems/export?status=failed, corrija e suba um novo lote; não refaça o lote inteiro. - Reconcilie por
identifiereendToEndId. Opix.out.completedde cada item e a linha emitems[]trazem os dois; oendToEndIdé o comprovante perante o Banco Central. - Respeite as janelas de limite. O
reviewmostradaily_out/nightly_outemonthly. Um lote maior que o limite disponível do dia não é bloqueado no dispatch — os itens excedentes falham na execução comlimit_exceeded_*. Se for o caso, divida em lotes por dia ou peça ajuste de limite. - Lotes grandes. Para milhares de linhas, suba por CSV (uma chamada) em vez de dezenas de chunks JSON, e peça à CorpX o
maxItemsadequado antes do fechamento.
Perguntas frequentes
Posso cancelar um lote depois do dispatch?
Não. Depois do 202 os itens já estão em execução no liquidante. O que você
controla é o momento do aceite: até o dispatch o lote é apenas um rascunho e
pode ser editado ou simplesmente abandonado em DRAFT/REVIEWED.
O que acontece se eu editar um lote REVIEWED?
Ele volta para DRAFT e todos os itens voltam a reviewStatus: PENDING.
Você precisa chamar review de novo. Isso vale para adicionar, remover ou
reenviar um item — a conferência sempre reflete o conteúdo atual.
O saldo era suficiente na conferência mas o dispatch deu 422. Por quê?
review.balance é um retrato do momento; outro pagamento pode ter saído
entre a conferência e o aceite. O dispatch checa o saldo de novo e recusa
sem iniciar nada se ele for menor que o total do lote. Reabasteça a
conta ou remova linhas e confira novamente.
Por que um item passou na conferência e falhou na execução?
A conferência valida o que dá para validar sem mover dinheiro: chave,
duplicidade, valor, limite por operação, saldo e janelas no agregado. Na
execução entram as regras do liquidante e do banco de destino (conta
encerrada, limite diário consumido por outros pagamentos, política da conta).
O código de erro é o mesmo do PIX avulso e vem em error.errorCode.
Posso reaproveitar um identifier?
Um identifier de item que falhou pode ser usado em um novo lote. Um
que liquidou não: a conferência marca identifier_conflict, porque na
conta existe um pagamento vivo com esse identificador. Essa é a proteção
contra pagamento duplicado — não a contorne gerando sufixos aleatórios.
Os itens do lote aparecem no extrato?
Sim, como PIX out individuais, com o identifier de cada linha. Não existe
um lançamento agregado do lote; GET .../pix/batches/{batchId} e o
resumo.csv dos comprovantes são a visão consolidada.
A conferência consome cota de DICT?
Sim, uma consulta por chave distinta não presente no cache de 24 h da conta,
contada na mesma janela de GET /pix/key/{pixKey}. Chaves repetidas no
lote e chaves consultadas recentemente não geram nova consulta. Em dados
bancários não há consulta ao DICT.
Como testo antes de produção?
Crie um lote pequeno, suba duas ou três linhas de valor simbólico para
contas suas, confira e dispare — o fluxo e os webhooks são idênticos aos de
um lote de milhares de linhas. Para validar apenas o arquivo sem pagar
nada, pare depois do review: o parser e a conferência já apontam todo
problema de formato, chave e duplicidade.
Erros
A lista completa, com âncoras, está em Tratamento de erros.
Veja também
- PIX Out — o pagamento avulso que cada linha do lote executa.
- Consultas de chave PIX — cota e cache do DICT usados na conferência.
- Segurança da conta — travas, PIN transacional e cabeçalhos de cash out.
- Idempotência — como a
Idempotency-Keyse comporta em toda a API. - Webhooks —
pix.batch.completede os eventospix.out.*por item.