Split de pagamentos

Referência

Split divide automaticamente o valor de uma cobrança Pix entre a conta que a criou e outras contas ValidaPay, no momento em que o pagamento é confirmado. Este guia explica os dois modelos de split, os campos de uma regra, como o valor é calculado e limitado, e quando a transferência de fato acontece.

As três páginas deste grupo reaproveitam as mesmas rotas já documentadas em Pix: POST /v1/charges/pix e GET /v1/charges/:chargeId. O que muda é o array split no corpo e o header X-Sub-Account.

Duas rotas já conhecidas

Cobrança imediata com split e Split para Conta Master são as duas variações de POST /v1/charges/pix (escopo charges/write). Status de cobrança com split é a mesma GET /v1/charges/:chargeId (escopo charges/read) do grupo Pix, só que aplicada a uma cobrança que tem split.

Os dois modelos de split

ModeloOnde a cobrança nasceComo configurar
Master divide com parceirosConta master (sem X-Sub-Account)Array split com accountNumber de cada recebedor
Seller divide com a masterSubconta, header X-Sub-AccountArray split sem accountNumber: a parcela cai automaticamente na master que autenticou a chamada

Master divide com parceiros (Cobrança imediata com split): a cobrança nasce na sua conta e a regra informa a conta de cada parceiro.

Seller divide com a master (Split para Conta Master): você envia o header X-Sub-Account com o número da subconta do seller, e a cobrança nasce nela. Como a regra do split não informa accountNumber, a API resolve automaticamente para a sua conta master.

Master divide com parceiros

JSON
{
  "amount": 1.00,
  "externalTxid": "loja-01-caixa-03",
  "split": [
    { "type": "fixed", "accountNumber": "896532569", "amount": 0.10 },
    { "type": "fixed", "accountNumber": "125485692", "amount": 0.10 }
  ]
}

Seller divide com a master (com X-Sub-Account)

JSON
{
  "amount": 1.00,
  "externalTxid": "loja-01-caixa-03",
  "split": [
    { "type": "fixed", "amount": 0.10 }
  ]
}

Campos de uma regra de split

CampoObrigatórioDescrição
typeSim"fixed" ou "percentage", sempre em minúsculo.
amountSimValor em reais quando fixed; percentual de 0 a 100 quando percentage. Sempre positivo.
accountNumberCondicionalConta do recebedor. Omitido no modelo "seller para a master" (ver acima).
  • Informe accountNumber. No modelo "seller para a master", deixe de fora: a API preenche com a master do token.
  • Máximo de 20 recebedores por cobrança.
  • A soma dos splits do tipo percentage não pode passar de 100%.
  • A mesma conta não pode aparecer em duas regras do mesmo split.

Cálculo e limite do split

  • Uma regra percentage é sempre calculada sobre o valor bruto da cobrança (amount), nunca sobre o valor líquido.
  • Uma regra fixed usa exatamente o valor informado.
  • A soma de todas as regras já resolvidas não pode passar do valor líquido da cobrança (valor bruto menos a taxa Pix da conta). Se a conta tiver crédito de taxa suficiente, o limite passa a ser o próprio valor bruto.
  • Passar do limite retorna 400 SPLIT_EXCEEDS_NET_AMOUNT, com os dois valores já calculados na mensagem.
JSON
{
  "error": {
    "message": "O valor dos splits (R$12.00) excede o valor líquido da cobrança (R$9.80)",
    "code": "SPLIT_EXCEEDS_NET_AMOUNT",
    "details": null,
    "timestamp": "2026-02-18T22:19:31.013Z"
  }
}

Quando o dinheiro é transferido

Criar a cobrança só registra as regras do split; nenhuma transferência acontece nesse momento. O dinheiro só se move quando o Pix é efetivamente pago: nesse instante, a ValidaPay calcula o valor de cada regra sobre o valor bruto, credita cada recebedor (categoria SPLIT_IN no extrato dele) e credita o restante, já descontadas taxa e splits, na conta que gerou a cobrança (categoria PAYMENT).

Cada regra do split é processada de forma independente. Se a transferência de uma regra falhar (por exemplo, a conta foi bloqueada depois da criação da cobrança), as outras regras e o valor do dono da cobrança seguem normalmente. O erro daquela regra fica registrado em splitRules[].error, e o split como um todo fica PARTIAL (nenhuma regra passou) ou FAILED (nenhuma regra deu certo) na consulta de status.

Consultando uma cobrança com split

O mesmo GET /v1/charges/:chargeId de Pix traz, quando a cobrança tem split, o objeto splitscom o resultado de cada regra. Quando a cobrança nasceu numa subconta (modelo "seller para a master"), a resposta também traz accountId (a subconta dona da cobrança) e masterAccountId (a master dela):

JSON
{
  "chargeId": "cha_1774539002481_sp1itxk9a",
  "status": "PAID",
  "amount": 1.00,
  "paymentType": "PIX",
  "accountId": "896532569",
  "masterAccountId": "428965347",
  "emv": "00020101021226910014br.gov.bcb.pix2569qrcode.pix.celcoin.com.br/pixqrcode/v2/77e66fbad26b0b294eeb56c7c7c29f5204000053039865802BR5909ValidaPix6013Florianopolis62070503***6304BA13",
  "paidAt": "2026-02-18T22:22:50.031Z",
  "createdAt": "2026-02-18T22:19:31.013Z",
  "splits": {
    "id": "spl_1774539002481_a1b2c3d4e",
    "chargeId": "cha_1774539002481_sp1itxk9a",
    "splitRules": [
      {
        "type": "fixed",
        "amount": 0.10,
        "accountNumber": "428965347",
        "paidAmount": 0.10,
        "paidAt": "2026-02-18T22:22:51.203Z",
        "error": null
      }
    ],
    "createdAt": "2026-02-18T22:19:31.013Z",
    "updatedAt": "2026-02-18T22:22:51.203Z"
  }
}

A conta master pode consultar diretamente o status de uma cobrança criada em qualquer uma das suas subcontas, sem precisar enviar X-Sub-Account no GET.

Webhooks de confirmação

Não existe um evento próprio para o split. A confirmação do pagamento chega pelo mesmo payment.success de Pix. No modelo "seller para a master" (cobrança com masterAccountId), a ValidaPay dispara payment.success duas vezes: uma para a subconta dona da cobrança, e outra para a conta master, com o campo extra subAccountId identificando a subconta de origem.

Para saber se uma regra específica do split falhou, consulte GET /v1/charges/:chargeId e leia splitRules[].error: essa informação não vai no webhook.

Erros comuns

codeStatusQuando acontece
INVALID_DATA400Corpo não passou na validação: type/amount ausente, split percentual acima de 100%, soma dos percentuais acima de 100%, mais de 20 recebedores, ou regra sem accountNumber.
SPLIT_ACCOUNT_NOT_FOUND400O accountNumber informado não corresponde a nenhuma conta ValidaPay.
SPLIT_ACCOUNT_BLOCKED400Uma das contas de destino do split está bloqueada.
SPLIT_DUPLICATE_RECIPIENT400A mesma conta aparece em mais de uma regra do split.
SPLIT_EXCEEDS_NET_AMOUNT400A soma das regras (já resolvidas) passa do valor líquido disponível para split.
NOT_FOUND404X-Sub-Account aponta para uma subconta que não existe.
UNAUTHORIZED401A subconta em X-Sub-Account não pertence à master autenticada.

NOT_FOUND e UNAUTHORIZED só acontecem no modelo "seller para a master", quando X-Sub-Account aponta para uma subconta inexistente ou que não pertence à master autenticada.

Perguntas frequentes

Preciso informar accountNumber quando o split é para a minha própria conta master (Split para Conta Master)?
Não. Se você omitir accountNumber na regra, a API preenche automaticamente com a conta master associada ao token usado na chamada. É esse preenchimento automático que permite gerar a cobrança na subconta (via X-Sub-Account) e direcionar a parcela para quem está autenticado, sem precisar saber o próprio número de conta de antemão.
O percentual do split é calculado sobre o valor bruto ou líquido da cobrança?
Sempre sobre o valor bruto (amount). O limite que pode barrar a cobrança é outro: a soma de todas as regras já resolvidas (percentuais convertidos em reais mais os valores fixos) não pode passar do valor líquido disponível para split.
O que acontece se a conta de um recebedor for bloqueada depois que a cobrança já foi criada?
Só aquela regra falha no momento da liquidação: o erro fica registrado em splitRules[].error para essa regra, o status do split na consulta vira PARTIAL ou FAILED, e as demais regras (e o valor que sobra para o dono da cobrança) são processadas normalmente.
A subconta precisa estar aprovada antes de eu poder direcionar split para ela?
Sim. O onboarding da subconta precisa estar concluído (conta criada) antes que ela possa aparecer como accountNumber em uma regra de split ou ser usada em X-Sub-Account. Veja Subcontas: Referência.
Essa página foi útil?