SelectwinDOCS
Assinaturas

Splits de recebíveis

Os splits dividem automaticamente a receita de cada cobrança recorrente da assinatura entre você (o merchant) e outros destinatários — sócios, parceiros, afiliados ou subcontas. Você define quem receb

Os splits dividem automaticamente a receita de cada cobrança recorrente da assinatura entre você (o merchant) e outros destinatários — sócios, parceiros, afiliados ou subcontas. Você define quem recebe, quanto (percentual ou valor fixo em centavos) e quem arca com a taxa de processamento e com eventuais chargebacks. Use os endpoints abaixo para adicionar, listar, consultar, atualizar e remover esses repasses.

Split (repasse): regra que encaminha parte do valor de uma cobrança para outra conta no momento da liquidação. Em vez de receber 100% e repassar manualmente, a Selectwin faz a divisão para você a cada ciclo da assinatura.

Como funciona

Toda assinatura nasce com 100% da receita indo para o merchant (a conta dona da assinatura). Cada split que você adiciona "fatia" uma parte desse total para outro recipient. O servidor mantém o controle de quanto já foi alocado:

  • totalPercentage — soma dos percentuais já configurados em splits.
  • remainingPercentage — quanto da receita ainda não foi alocado (em pontos percentuais).
  • remainingAmount — o mesmo restante, mas estimado em centavos (string), com base no valor atual da assinatura.

A divisão é aplicada a cada cobrança recorrente: ao adicionar um split, ele passa a valer dos próximos ciclos em diante, não retroage a cobranças já liquidadas. Cada split carrega duas regras de responsabilidade:

  • chargeProcessingFee — se true, a taxa de processamento da Selectwin é descontada da fatia desse destinatário (em vez de sair só da sua).
  • liable — se true, esse destinatário é corresponsável por chargebacks (estornos forçados pelo portador); o valor estornado pode ser debitado dele.

Importante

Os endpoints de split usam dois caminhos diferentes. Adicionar (POST) e listar (GET) operam na coleção /splits. Consultar e atualizar identificam o split pelo splitId no caminho (/splits/{splitId}). Já remover (DELETE) recebe o splitId como query string, não no caminho. Preste atenção nessa diferença.

OperaçãoMétodoCaminhoIdentifica o split porRetorna
AdicionarPOST/v1/subscriptions/{subscriptionId}/splitsresumo dos splits
ListarGET/v1/subscriptions/{subscriptionId}/splitslista paginada
ConsultarGET/v1/subscriptions/{subscriptionId}/splits/{splitId}caminhoum split
AtualizarPUT/v1/subscriptions/{subscriptionId}/splits/{splitId}caminhoo split atualizado
RemoverDELETE/v1/subscriptions/{subscriptionId}/splits?splitId=...queryresumo dos splits

O objeto split

CampoTipoDescrição
idstringID público do split (ex.: split_01hqzvabc). Opaco — não faça parsing.
recipientstringID da conta destinatária do repasse (ex.: bus_9876543210).
typeenumpercentage (percentual de 0 a 100) ou flat (valor fixo em centavos).
valuenumberPercentual quando type=percentage; valor em centavos quando type=flat. Intervalo 020000000.
chargeProcessingFeebooleanSe true, a taxa de processamento sai da fatia deste destinatário.
liablebooleanSe true, o destinatário é corresponsável por chargebacks.
createdAtstringData de criação, ISO 8601 UTC (2026-04-12T17:56:33.000Z).
updatedAtstringData da última atualização, ISO 8601 UTC.

Atenção ao type e ao value

O type aceita exatamente dois valores: percentage ou flat. Não existe percent. Quando type=percentage, value é um número de 0 a 100 (ex.: 30 = 30%). Quando type=flat, value é um inteiro em centavos (ex.: 1500 = R$ 15,00) — nunca um valor decimal em reais.

Quando usar

  • Marketplaces e plataformas que cobram uma assinatura do cliente final e precisam repassar parte ao vendedor/criador a cada ciclo.
  • Comissões de afiliados recorrentes (um percentual fixo da mensalidade vai para quem indicou).
  • Sociedades que dividem a receita de um produto recorrente entre contas distintas.

Quando não usar: para uma divisão pontual de uma única cobrança avulsa, use os splits da própria transação (recurso Transactions), não os da assinatura. Splits de assinatura são para repasses que se repetem a cada ciclo.

Requisição

Headers

Toda chamada exige autenticação por header SelectKey; chamadas com corpo (POST, PUT) exigem Content-Type: application/json.

HeaderObrigatórioValor
SelectKeysimSua chave de API. Produção: sl_live_...; sandbox: sl_test_.... Nunca use Authorization: Bearer/Basic.
Content-Typeem POST/PUTapplication/json

Veja Autenticação e Convenções (camelCase, centavos, datas ISO 8601 UTC, IDs opacos).


Adicionar um split

POST /v1/subscriptions/{subscriptionId}/splits

Cria um novo repasse na assinatura. A resposta é o resumo atualizado de todos os splits — não a assinatura inteira nem só o split criado.

Parâmetros de caminho

NomeTipoObrigatórioDescrição
subscriptionIdstringsimID público da assinatura (ex.: subs_01hqzvabc).

Corpo

CampoTipoObrigatórioDescrição
recipientstringsimID da conta que receberá o repasse.
typeenumsimpercentage ou flat.
valuenumbersimPercentual (0–100) ou centavos, conforme type. Intervalo 020000000.
curl -X POST "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
  -H "Content-Type: application/json" \
  -d '{
    "recipient": "acc_abc123",
    "type": "percentage",
    "value": 10
  }'

Resposta — 200 OK

{
  "subscription": "subs_01hqzvabc",
  "splits": [
    {
      "id": "split_01hqzvabc",
      "recipient": "bus_9876543210",
      "type": "percentage",
      "value": 30,
      "chargeProcessingFee": true,
      "liable": true,
      "updatedAt": "2026-04-12T17:56:33.000Z",
      "createdAt": "2026-04-12T17:56:33.000Z"
    }
  ],
  "totalPercentage": 30,
  "remainingPercentage": 60,
  "remainingAmount": "9900",
  "merchant": { "name": "Seller Name", "merchantId": "bus_1234567890", "isSubAccount": false },
  "_links": {
    "self": { "href": "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits", "method": "POST", "description": "Add splits to subscription." },
    "list": { "href": "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits", "method": "GET", "description": "List splits of a subscription." }
  }
}
Campo da respostaTipoO que significa
subscriptionstringpublicId da assinatura (string, não um objeto).
splitsarrayTodos os splits configurados na assinatura.
totalPercentageintegerSoma dos percentuais já alocados.
remainingPercentageintegerPercentual ainda não alocado.
remainingAmountstringValor restante estimado, em centavos, como string.
merchantobjectDados resumidos da conta dona da assinatura.
_linksobjectLinks HATEOAS para as próximas ações (self, list).

O remainingAmount vem como string ("9900"), não como número. Converta para inteiro antes de fazer contas.


Listar os splits

GET /v1/subscriptions/{subscriptionId}/splits

Retorna a lista paginada de splits da assinatura.

Parâmetros

NomeEmTipoObrigatórioDescrição
subscriptionIdpathstringsimID público da assinatura.
limitquerynumbernãoItens por página, 1100 (padrão 20).
offsetquerynumbernãoQuantos itens pular (0 ou mais).
sortqueryenumnãoOrdem: ascending ou descending.
curl "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits?limit=20&sort=descending" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"

Resposta — 200 OK

{
  "offset": 0,
  "limit": 20,
  "total": 2,
  "hasMore": false,
  "page": { "current": 1, "total": 1, "offset": { "first": 0, "prev": null, "next": null, "last": 0 } },
  "data": [
    {
      "id": "split_01hqzvabc",
      "recipient": "bus_other",
      "type": "percentage",
      "value": 30,
      "chargeProcessingFee": true,
      "liable": true,
      "updatedAt": "2026-04-12T17:56:33.000Z",
      "createdAt": "2026-04-12T17:56:33.000Z"
    }
  ],
  "merchant": { "name": "Seller Name", "merchantId": "bus_1234567890", "isSubAccount": false },
  "_links": { "self": { "href": "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits", "method": "GET" } }
}

Os splits ficam em data; o envelope traz a paginação (offset, limit, total, hasMore, page). Para detalhes do esquema de páginas, veja Paginação.


Consultar um split

GET /v1/subscriptions/{subscriptionId}/splits/{splitId}

Retorna um único split pelo seu ID. Aqui o splitId vai no caminho.

Parâmetros de caminho

NomeTipoObrigatórioDescrição
subscriptionIdstringsimID público da assinatura.
splitIdstringsimID público do split (ex.: split_01hqzvabc).
curl "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits/split_01hqzvabc" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"

Resposta — 200 OK

{
  "id": "split_01hqzvabc",
  "recipient": "bus_other",
  "type": "percentage",
  "value": 30,
  "chargeProcessingFee": true,
  "liable": true,
  "updatedAt": "2026-04-12T17:56:33.000Z",
  "createdAt": "2026-04-12T17:56:33.000Z",
  "merchant": { "name": "Seller Name", "merchantId": "bus_1234567890", "isSubAccount": false },
  "_links": { "self": { "href": "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits/split_01hqzvabc", "method": "GET" } }
}

Diferente do resumo retornado por POST/DELETE, aqui o objeto raiz é o próprio split (com merchant e _links ao lado), sem totalPercentage/remainingPercentage.


Atualizar um split

PUT /v1/subscriptions/{subscriptionId}/splits/{splitId}

Substitui a configuração de um split existente. Como é um PUT, envie o objeto completo (recipient, type, value) — campos omitidos não são preservados.

Parâmetros de caminho

NomeTipoObrigatórioDescrição
subscriptionIdstringsimID público da assinatura.
splitIdstringsimID público do split a atualizar.

Corpo

CampoTipoObrigatórioDescrição
recipientstringsimID da conta destinatária.
typeenumsimpercentage ou flat.
valuenumbersimPercentual (0–100) ou centavos, conforme type. Intervalo 020000000.
curl -X PUT "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits/split_01hqzvabc" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ" \
  -H "Content-Type: application/json" \
  -d '{
    "recipient": "acc_abc123",
    "type": "percentage",
    "value": 10
  }'

Resposta — 200 OK

Retorna o split atualizado (mesmo formato da consulta):

{
  "id": "split_01hqzvabc",
  "recipient": "bus_other",
  "type": "percentage",
  "value": 30,
  "chargeProcessingFee": true,
  "liable": true,
  "updatedAt": "2026-04-12T17:56:33.000Z",
  "createdAt": "2026-04-12T17:56:33.000Z",
  "merchant": { "name": "Seller Name", "merchantId": "bus_1234567890", "isSubAccount": false },
  "_links": { "self": { "href": "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits/split_01hqzvabc", "method": "GET" } }
}

Remover um split

DELETE /v1/subscriptions/{subscriptionId}/splits?splitId=...

Remove um split da assinatura. O split a remover é identificado pelo splitId na query string (não no caminho). A resposta é o resumo atualizado, com remainingPercentage/remainingAmount recalculados.

Parâmetros

NomeEmTipoObrigatórioDescrição
subscriptionIdpathstringsimID público da assinatura.
splitIdquerystringsimID público do split a remover (padrão ^[a-z]+_[A-Za-z0-9]+$, ex.: split_abc123).
curl -X DELETE "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits?splitId=split_01hqzvabc" \
  -H "SelectKey: sl_live_aBcDeFgHiJkLmNoPqRsTuVwXyZ"

Resposta — 200 OK

{
  "subscription": "subs_01hqzvabc",
  "splits": [
    {
      "id": "split_01hqzvabc",
      "recipient": "bus_9876543210",
      "type": "percentage",
      "value": 30,
      "chargeProcessingFee": true,
      "liable": true,
      "updatedAt": "2026-04-12T17:56:33.000Z",
      "createdAt": "2026-04-12T17:56:33.000Z"
    }
  ],
  "totalPercentage": 30,
  "remainingPercentage": 60,
  "remainingAmount": "9900",
  "merchant": { "name": "Seller Name", "merchantId": "bus_1234567890", "isSubAccount": false },
  "_links": {
    "self": { "href": "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits", "method": "DELETE", "description": "Remove split of subscription." },
    "list": { "href": "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits", "method": "GET", "description": "List splits of subscription." },
    "create": { "href": "https://api.selectwin.io/v1/subscriptions/subs_01hqzvabc/splits", "method": "POST", "description": "Add split of subscription." }
  }
}

A remoção libera a fatia daquele split de volta para o restante não alocado — note remainingPercentage/remainingAmount mudando no resumo.

Erros

Trate sempre pelo error.code, nunca pela message. Veja Tratamento de Erros e o Catálogo de Códigos de Erro.

error.codeHTTPQuando ocorre
invalidParameters400Corpo/parâmetro inválido — type fora de percentage/flat, value fora de 020000000, recipient ausente ou splitId malformado. Detalhes em error.params.
insufficientFundsError402Saldo insuficiente para a operação (em cenários que envolvem movimentação de fundos).
(autenticação)401SelectKey ausente, inválida ou revogada.
(autorização)403Autenticada, mas sem permissão para a assinatura/destinatário, ou limite atingido.
(não encontrado)404subscriptionId ou splitId não existe.
(validação de negócio)422Regra de negócio impede a operação (ex.: alocação acima do disponível).
(rate limit)429Muitas requisições — respeite error.retryAfterMinutes e use backoff.
serverError500Erro interno — repita com backoff; se persistir, contate o suporte.

Boas práticas

  • Acompanhe o remainingPercentage/remainingAmount retornados no resumo antes de adicionar outro split, para não exceder 100% da receita. Lembre que remainingAmount vem como string — converta para inteiro.
  • Trate o value segundo o type: percentual (0–100) para percentage, centavos para flat. Misturar as duas leituras é a fonte mais comum de bug.
  • Em atualizações (PUT), envie o objeto completo. Por ser substituição, omitir um campo não o mantém — reenvie recipient, type e value.
  • Cuidado com o splitId no DELETE: ele vai na query string (?splitId=...), ao contrário do GET/PUT, que usam o caminho. Validar o splitId contra o padrão ^[a-z]+_[A-Za-z0-9]+$ evita um 400.
  • Decida chargeProcessingFee e liable conscientemente: definem quem absorve a taxa e quem responde por chargebacks. Documente o acordo comercial antes de configurar.
  • Trate IDs como opacos. Armazene id, recipient e subscriptionId como strings inteiras; não faça parsing nem confie no prefixo.
  • Não retroage: splits valem a partir das próximas cobranças do ciclo. Ajuste-os antes da data de cobrança para que entrem em vigor no ciclo desejado.

Veja também

How is this guide?

On this page