Split de pagamentos
Cobrança no cartão com split
Cria uma cobrança no cartão de crédito e divide o valor com outras contas ValidaPay. O split é aplicado na própria transação do cartão: cada recebedor recebe a parte dele direto na conta ValidaPay dele, no prazo de recebimento de cartão, junto com os demais recebíveis.
/v1/charges/singlehttps://api.validapay.com.brhttps://sandbox.validapay.com.brCase de uso:
Como plataforma com parceiros, quero vender no cartão e repassar a comissão de cada parceiro na própria venda, sem transferir depois.
Como o valor é dividido
fixed— o recebedor ganha exatamente o valor informado.percentage— incide sobre o valor da cobrança sem a taxa repassada ao comprador. CompassFeesToCustomer, o comprador paga a taxa do cartão, mas o percentual do parceiro é calculado sobre o preço (ex.: cobrança de R$ 100,00 em 3x com repasse, comprador paga R$ 107,10 e o parceiro de 10% recebe R$ 10,00).- A taxa do cartão sai inteira da sua conta. Você fica com o valor líquido menos a parte dos recebedores.
- O meio centavo de arredondamento fica com a sua conta.
Quem pode receber
O recebedor é identificado pelo Id Público da conta (no painel, Gerenciamento > Minha Conta > Id Público). No cartão ele precisa:
- ter a mesma configuração de recebimento de cartão que a sua conta, incluindo o mesmo prazo de recebimento (por exemplo, as duas em D+30);
- estar habilitado para receber cartão na ValidaPay. Uma conta que nunca vendeu no cartão ainda não está habilitada.
Se algum recebedor não atender, a cobrança não é criada e a API responde 400 com o motivo.
Limite do split
A soma dos recebedores não pode passar do valor líquido da cobrança, já descontada a taxa do cartão. A conta usa o pior caso de parcelas que o comprador pode escolher (maxInstallments). Com passFeesToCustomer, vale a maior quantidade de parcelas sem repasse (freeInstallments).
Pagar agora ou depois
- Com
cardToken: o cartão é cobrado na hora e o split já sai aplicado. - Sem
cardToken: a cobrança ficaPENDINGe o comprador paga pelo link. O split configurado na criação é aplicado no pagamento.
Se, entre a criação e o pagamento, algum recebedor deixar de poder receber cartão, a cobrança não é feita: a API responde 400 SPLIT_NOT_APPLIED com uma mensagem genérica para o comprador, e a ValidaPay é alertada. Ajuste o split e gere uma nova cobrança.
Estorno
O estorno total funciona normalmente. O estorno parcial de uma cobrança no cartão com split pode não estar disponível: nesse caso a rota de estorno responde 400 CARD_SPLIT_PARTIAL_REFUND_UNSUPPORTED e é preciso fazer o estorno total.
Pix e boleto
Esta mesma rota aceita split com paymentMethod pix ou boleto. Nesses métodos o valor do recebedor é transferido para a conta dele quando o pagamento é confirmado.
⚠️ A rota de checkout transparente (
POST /v1/charges) não aceita split no cartão nem no Pix Automático. Para cartão com split, use esta rota.
Resposta
200— comcardTokene cartão aprovado:success: true,chargeId,status: "paid". SemcardToken:status: "PENDING", mais as opções de parcelamento.402— cartão recusado pelo banco:success: false,status: "failed"e o motivo emerror.
Erros do split
400 SPLIT_RECIPIENT_NOT_FOUND— nenhum recebedor com esse Id Público400 SPLIT_RECIPIENT_PROVIDER_MISMATCH— o recebedor tem outra configuração de recebimento de cartão400 SPLIT_RECIPIENT_SCHEDULE_MISMATCH— o recebedor tem outro prazo de recebimento de cartão400 SPLIT_RECIPIENT_SELLER_NOT_FOUND— o recebedor ainda não está habilitado para receber cartão400 SPLIT_RECIPIENT_SELLER_INACTIVE— a habilitação de cartão do recebedor está inativa400 SPLIT_RECIPIENT_ACCOUNT_BLOCKED— a conta do recebedor está bloqueada400 SPLIT_DUPLICATE_RECIPIENT— o mesmo recebedor aparece mais de uma vez400 SPLIT_EXCEEDS_NET_AMOUNT— a soma dos recebedores passa do valor líquido no pior caso de parcelas400 SPLIT_NOT_APPLIED— um recebedor deixou de ser elegível antes do pagamento; a cobrança não foi feita
Authorizations
Authorization
string obrigatório
Cabeçalho de autenticação Bearer no formato Bearer {{token}} onde {{token}} é o seu token OAuth2.
Escopos requeridos
Body
application/json
{
"paymentMethod": "creditcard",
"amount": 100.00,
"title": "Plano anual",
"customer": {
"name": "João da Silva",
"email": "joao@email.com",
"documentNumber": "12345678901",
"phone": "+5511999998888",
"address": {
"street": "Av. Paulista",
"number": "1000",
"neighborhood": "Bela Vista",
"city": "Sao Paulo",
"state": "SP",
"zipCode": "01310100"
}
},
"cardToken": "ctk_9f8s7d6f5g4h3j2k1l0",
"deviceId": "dev_7a6b5c4d3e2f1a0b",
"installments": 1,
"maxInstallments": 12,
"passFeesToCustomer": false,
"freeInstallments": 1,
"split": [
{
"type": "percentage",
"publicId": "3f2a1c9e-1111-4222-8333-444455556666",
"amount": 10
},
{
"type": "fixed",
"publicId": "7b8c9d0e-2222-4333-8444-555566667777",
"amount": 5.00
}
]
}Schema
paymentMethodstringobrigatóriopixcreditcardboletopix_automaticoamountnumberobrigatóriotitlestringobrigatóriocustomerobjectobrigatóriosplitarray[2]obrigatóriocardTokenstringopcionaldeviceIdstringopcionalinstallmentsnumberopcional1 a 12maxInstallmentsnumberopcional1 a 12passFeesToCustomerbooleanopcionalfreeInstallmentsnumberopcional0 a 12const url = 'https://sandbox.validapay.com.br/v1/charges/single';
const options = {
method: 'POST',
headers: {
'Authorization': 'Bearer {{token}}',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"paymentMethod": "creditcard",
"amount": 100.00,
"title": "Plano anual",
"customer": {
"name": "João da Silva",
"email": "joao@email.com",
"documentNumber": "12345678901",
"phone": "+5511999998888",
"address": {
"street": "Av. Paulista",
"number": "1000",
"neighborhood": "Bela Vista",
"city": "Sao Paulo",
"state": "SP",
"zipCode": "01310100"
}
},
"cardToken": "ctk_9f8s7d6f5g4h3j2k1l0",
"deviceId": "dev_7a6b5c4d3e2f1a0b",
"installments": 1,
"maxInstallments": 12,
"passFeesToCustomer": false,
"freeInstallments": 1,
"split": [
{
"type": "percentage",
"publicId": "3f2a1c9e-1111-4222-8333-444455556666",
"amount": 10
},
{
"type": "fixed",
"publicId": "7b8c9d0e-2222-4333-8444-555566667777",
"amount": 5.00
}
]
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));Response Examples
200cartão aprovado▾
{
"success": true,
"customerId": "cus_1791478518377_ddakgbap7",
"chargeId": "cha_1791483206720_or87nbs4f",
"status": "paid"
}400recebedor com outro prazo de recebimento▾
{
"error": {
"message": "O recebedor PARCEIRO LTDA não pode receber split no cartão: tem prazo de recebimento de cartão diferente",
"code": "SPLIT_RECIPIENT_SCHEDULE_MISMATCH"
}
}