Visão geral
O recurso de Assinaturas (Subscriptions) gerencia cobranças recorrentes: planos mensais/anuais,
Introdução
O recurso de Assinaturas (Subscriptions) gerencia cobranças recorrentes: planos mensais/anuais, trials, ciclos de cobrança, itens (variantes) e divisão de receita (splits). Cada assinatura agrupa um cliente, um ou mais itens recorrentes e um método de pagamento, e a Selectwin orquestra automaticamente as cobranças de cada ciclo, emitindo webhooks a cada mudança de status.
Modelo Selectwin-strict
O endpoint POST /v1/subscriptions é Selectwin-strict: o preço vem das variantes (var_...), nunca
de valores manuais. Portanto:
- Não existe campo
amountno corpo da assinatura — o valor é sempre o snapshot da variante. - Cada item em
items[]deve referenciar uma variante recorrente viavariantId; você controla apenasquantity(e anotações).unitPrice/currency/pricingSchemasão congelados a partir da variante. - Uma variante inexistente retorna
variantNotFound(404); uma variante que não está precificada como recorrente retornavariantNotRecurring(422).
Os items devem referenciar variantes recorrentes (var_...; o prefixo legado prv_... também é aceito).
Estrutura do Objeto Assinatura
{
"id": "subs_01hqzvabc",
"status": "active",
"currency": "BRL",
"method": "credit",
"type": "recurring",
"currentCycle": {
"id": "scy_01hqzvabc",
"cycle": 1,
"status": "paid",
"startDate": "2026-04-01T00:00:00.000Z",
"endDate": "2026-05-01T00:00:00.000Z",
"dueDate": "2026-04-01T00:00:00.000Z",
"billedAt": "2026-04-01T10:15:00.000Z",
"updatedAt": "2026-04-01T10:15:00.000Z",
"createdAt": "2026-04-01T00:00:00.000Z"
},
"customer": { "id": "cus_01hqzvabc", "firstName": "João", "lastName": "Silva", "email": "[email protected]" },
"billing": {
"frequency": "monthly",
"frequencyCount": 1,
"endDate": null,
"exactDay": null,
"freeTrialDays": null,
"autoRenew": true,
"address": { "street": "Avenida Paulista", "number": "1000", "city": "São Paulo", "state": "SP", "postcode": "01310100", "country": "BR" }
},
"canceledAt": null,
"discount": null,
"discounts": null,
"shippable": false,
"shipping": null,
"spplited": false,
"splits": null,
"items": [
{ "id": "sit_01hqzvabc", "name": "Premium Plan", "enabled": true, "pricingSchema": "recurring", "unitPrice": 9900, "quantity": 1, "currency": "BRL" }
],
"callback": { "webhookUrl": "https://example.com/webhook", "active": true },
"geolocation": null,
"externalReference": "ORDER-123",
"metadata": { "campaign": "launch" },
"updatedAt": "2026-04-12T17:56:33.000Z",
"createdAt": "2026-04-12T17:56:33.000Z",
"merchant": { "name": "Seller Name", "merchantId": "bus_1234567890", "isSubAccount": false },
"_links": { }
}Valores em centavos.
items[].unitPriceé inteiro em centavos (ex.:9900= R$ 99,00). O objetocurrentCyclereflete o ciclo de cobrança vigente; a recorrência (frequência, dia, trial) fica sobbilling. Não há um campoamount/card/nameno topo do objeto.
Status da Assinatura
| Status | Descrição |
|---|---|
pending | Criada, aguardando a confirmação da primeira cobrança |
trialing | Em período de teste (trial), antes da primeira cobrança efetiva |
active | Ativa e em dia |
pastdue | Cobrança de um ciclo falhou; em retentativa |
unpaid | Retentativas esgotadas sem pagamento |
paused | Pausada (não cobra até ser retomada) |
canceled | Cancelada — não gera novos ciclos |
Ciclo de Vida
Recursos Disponíveis
| Recurso | Método | Endpoint | Descrição |
|---|---|---|---|
| Criar | POST | /v1/subscriptions | Cria uma assinatura recorrente |
| Listar | GET | /v1/subscriptions | Lista paginada de assinaturas |
| Consultar | GET | /v1/subscriptions/{id} | Detalhes de uma assinatura |
| Cancelar | POST | /v1/subscriptions/{id}/cancel | Cancela a assinatura (no fim do período ou imediatamente) |
| Pausar | POST | /v1/subscriptions/{id}/pause | Pausa a assinatura (não cobra até retomar) |
| Retomar | POST | /v1/subscriptions/{id}/resume | Retoma uma assinatura pausada |
| Ciclos | GET/POST | /v1/subscriptions/{id}/cycles | Lista, consulta e reagenda ciclos |
| Itens | GET/POST/PATCH/DELETE | /v1/subscriptions/{id}/items | Gerencia os itens (variantes) |
| Splits | GET/POST/PATCH/DELETE | /v1/subscriptions/{id}/splits | Divisão de receita por destinatário |
Cancelar, pausar e retomar são
POSTem sub-rotas (/cancel,/pause,/resume) e retornam a assinatura atualizada (200 OK). Não háDELETEpara assinaturas.
Webhooks Acionados
| Evento | Descrição |
|---|---|
subscription.created | Assinatura criada |
subscription.pending | Criada, aguardando a confirmação da primeira cobrança |
subscription.trialing | Entrou em período de trial |
subscription.active | Assinatura ativada (em dia) |
subscription.updated | Assinatura alterada (itens, splits, etc.) |
subscription.pastdue | Cobrança de ciclo falhou; em retentativa |
subscription.unpaid | Retentativas esgotadas sem pagamento |
subscription.paused | Assinatura pausada |
subscription.canceled | Assinatura cancelada |
Não existem os eventos
subscription.renewal/subscription.reactivated/subscription.expired. Cada ciclo cobrado gera uma transação com seus próprios eventos (transaction.approved/failed). A lista completa está no Catálogo de Eventos.
Sempre verifique a assinatura do webhook antes de processar — veja Verificando Assinaturas de Webhook.
Melhores Práticas
- Use variantes recorrentes para os itens; o preço é definido na variante, não na assinatura.
- Reaja a webhooks (
subscription.*) em vez de fazer polling — veja Proibição de Polling. - Trate
pastdue/unpaidnotificando o cliente para atualizar o método de pagamento. - Use
externalReference/metadatapara correlacionar com o seu sistema. - Idempotência: envie
X-Idempotency-Keyao criar — veja Idempotência.
Integração com Outros Recursos
- Customers — a assinatura é associada a um cliente (
customer.idou dados inline). - Products / Variants — os itens referenciam variantes recorrentes (
var_...). - Transactions — cada ciclo cobrado gera uma transação.
- Coupons — aplicáveis via
discounts[](códigos de cupom, re-aplicados por ciclo). - Webhooks — notificações em tempo real de mudanças de status.
How is this guide?