Subcontas e split
Subcontas recebem parte das vendas (split). Leia antes Subcontas e split para saber o que cada conta faz.
Rotas
| Rota | ||
|---|---|---|
POST |
/subaccounts |
criar (admin) |
GET |
/subaccounts |
lista (?status=, ?provider_account_id=, ?q=) |
GET |
/subaccounts/:id |
uma subconta, com totals e as últimas vendas divididas em splits |
PATCH |
/subaccounts/:id |
mudar name e metadata na SuyPay |
POST |
/subaccounts/:id/sync |
consultar a situação na conta agora |
POST |
/subaccounts/:id/onboarding-link |
link de cadastro para o titular (Pagar.me, Asaas) |
GET |
/subaccounts/:id/balance |
saldo da subconta |
POST |
/subaccounts/:id/withdrawals |
sacar para o destino da subconta (exige Idempotency-Key) |
GET |
/subaccounts/:id/withdrawals |
saques dessa subconta |
Chaves só cobranças não chegam a essas rotas.
Criar
curl https://api.suypay.com/v1/subaccounts \
-H "Authorization: Bearer suy_live_..." \
-H "Content-Type: application/json" \
-d '{
"provider_account_id": "pa_...",
"type": "individual",
"name": "João Souza",
"document": "12345678909",
"email": "joao@email.com",
"phone": "11912345678",
"birthdate": "1990-05-20",
"mother_name": "Ana Souza",
"occupation": "Vendedor",
"monthly_income": 500000,
"address": { "zip": "01310-100", "street": "Av. Paulista", "number": "1000", "neighborhood": "Bela Vista", "city": "São Paulo", "state": "SP" },
"bank_account": { "bank": "341", "branch": "1234", "account": "123456", "account_digit": "7", "type": "checking" },
"transfer_interval": "weekly"
}'
| Campo | |
|---|---|
provider_account_id |
a conta conectada onde a subconta fica |
type |
individual (CPF) ou company (CNPJ). Sem ele, vem do tamanho do documento |
name, document |
sempre |
email, phone, birthdate (AAAA-MM-DD), mother_name, occupation, monthly_income (centavos) |
quando a conta pede |
address |
zip, street, number, neighborhood, city, state, complement |
bank_account |
bank (3 números), branch, branch_digit, account, account_digit, type (checking/savings), holder_name. Mesmo CPF/CNPJ da subconta |
pix_key |
{ "key_type": "cpf" | "cnpj" | "email" | "phone" | "random", "key" } (Woovi) |
company |
trading_name (razão social), company_type (Asaas: MEI, LIMITED, INDIVIDUAL, ASSOCIATION; Pagar.me: LTDA, MEI…), founding_date, annual_revenue (centavos) |
partner |
sócio administrador de empresa (Pagar.me): mesmos campos de pessoa |
transfer_interval |
repasse automático na Pagar.me: daily, weekly ou monthly |
metadata |
até 20 chaves suas |
Se faltar um campo que a conta exige, a resposta é 400 dizendo qual, em error.param. GET /providers mostra em capabilities.subaccounts.requires o que cada conta pede.
{
"id": "sub_...",
"object": "subaccount",
"status": "pending",
"status_detail": "Falta o titular concluir o cadastro (prova de vida). Já pode vender, mas não sacar.",
"provider": "pagarme",
"provider_account_id": "pa_...",
"provider_subaccount_id": "re_...",
"type": "individual",
"name": "João Souza",
"document": "12345678909",
"details": { "bank_account": { "bank": "341", "branch": "1234", "account": "****456-7", "holder": "João Souza" } }
}
No Asaas, a chave de API da subconta (que o Asaas mostra uma vez só) fica guardada com criptografia na SuyPay, para consultar a situação e o saldo dela. Ela nunca volta pela API.
Link de cadastro
curl -X POST https://api.suypay.com/v1/subaccounts/sub_.../onboarding-link -H "Authorization: Bearer suy_live_..."
{ "url": "https://...", "expires_at": "2026-10-19T17:00:00Z", "qr_code_base64": null }
Dividir uma cobrança
Mande splits em POST /payments:
| Campo | |
|---|---|
subaccount_id |
sub_... ativa ou em cadastro |
amount |
centavos do valor da venda, ou |
percentage |
porcentagem do valor da venda (até duas casas) |
Todas as subcontas precisam ser da mesma conta conectada, e as partes somam menos que o valor, deixando o bastante para a taxa. A cobrança devolvida traz splits: [{ "subaccount_id", "amount" }] em centavos.
Sacar
curl https://api.suypay.com/v1/subaccounts/sub_.../withdrawals \
-H "Authorization: Bearer suy_live_..." \
-H "Idempotency-Key: repasse-joao-2026-10" \
-H "Content-Type: application/json" \
-d '{ "amount": 150000 }'
A resposta é um objeto payout com subaccount_id e destination: { "type": "subaccount" }. Na Woovi, amount é ignorado: o saque leva o saldo inteiro. A subconta precisa estar active.
Avisos
subaccount.created e subaccount.updated chegam no seu webhook com o objeto subaccount. Os saques avisam como qualquer saque (payout.*).