Skip to main content

Visão geral

O sistema de assinaturas da PlugToPay opera em três camadas: O fluxo básico é: criar plano → criar assinatura → coletar cartão via Checkout → cobrar. A partir daí, a PlugToPay cobra automaticamente a cada ciclo, com retentativas em caso de falha, e dispara webhooks a cada evento relevante.

Criar assinatura

POST /api/v1/subscriptions — requer X-Client-ID + X-API-Key.
O sistema impede a criação de uma segunda assinatura ativa do mesmo cliente no mesmo plano. Para mudar o plano, use a troca de plano em vez de cancelar e recriar.
Validação de min_card_months: se o plano tiver esse campo definido, o cartão informado deve ter validade mínima de min_card_months meses a partir de hoje. Uma assinatura anual com min_card_months: 13, por exemplo, impede o uso de um cartão que vence em 6 meses. Resposta 201:

Status possíveis


Ciclo de faturamento

Quando next_billing_at é atingido, a PlugToPay:
  1. Cria um ciclo pending para o período
  2. Aplica o desconto do cupom (se elegível pelo max_cycles)
  3. Tenta cobrar o cartão via CreatePaymentCardService (mesmo fluxo de pagamento avulso com cartão tokenizado)
  4. Sucesso → ciclo marcado como paid, período avança, webhook subscription.payment.success
  5. Falha → ciclo marcado como failed, retentativas agendadas, webhook subscription.payment.failed
Lógica de retentativas: Após a 4ª tentativa sem sucesso, a assinatura vai para past_due e o webhook subscription.past_due é disparado. Nesse estado, nenhuma nova cobrança automática ocorre — o cliente deve atualizar o cartão. Cálculo do billing_day:
  • weekly: o billing_day é ignorado; o ciclo avança exatamente pelo número de semanas definido
  • monthly / yearly: a cobrança ocorre no billing_day do próximo mês/ano (sempre limitado a 28)

Listar assinaturas

GET /api/v1/subscriptions — requer X-Client-ID + X-API-Key. Retorna lista paginada. Suporta filtros (consultar via parâmetros de query).

Consultar assinatura

GET /api/v1/subscriptions/{uuid} — requer X-Client-ID + X-API-Key. Retorna o objeto completo com plan, customer, card, coupon e datas de período.

Listar ciclos

GET /api/v1/subscriptions/{uuid}/cycles — requer X-Client-ID + X-API-Key. Retorna o histórico de ciclos de faturamento da assinatura:

Coletando o cartão via Checkout

Use o Checkout Session para coletar os dados do cartão do cliente no frontend sem expor sua chave de API. O fluxo funciona em dois estágios: primeiro a assinatura é criada (ficando no estado incomplete), depois o cartão é coletado e a primeira cobrança é disparada automaticamente.
Assinaturas em planos com trial ficam em trialing ao invés de incomplete. Nesse caso, o cartão é salvo mas a cobrança só ocorre quando o trial encerrar.

Passo 1 — Criar a assinatura sem cartão

POST /api/v1/subscriptions
A resposta retorna a assinatura com status: "incomplete" e o id que será usado no próximo passo.

Passo 2 — Criar uma sessão de checkout vinculada à assinatura

POST /api/v1/checkout/sessions — requer X-Client-ID + X-API-Key.
Resposta:
Passe o token (cs_live_...) ao frontend. O array saved_cards pode ser exibido para que o cliente escolha um cartão já cadastrado.

Passo 3 — Submeter o cartão pelo frontend

POST /api/v1/checkout/subscriptions/card — autenticado via X-Checkout-Token.
O X-Checkout-Token é de uso único. Após este request ser processado, o token é invalidado automaticamente. Crie uma nova sessão se precisar tentar novamente.
Resposta — assinatura atualizada:
Para assinaturas que estavam em incomplete, a cobrança do primeiro ciclo é disparada imediatamente. Se o cartão for aprovado, status passa para active. Se for recusado, passa para past_due e as retentativas são agendadas automaticamente.

Diagrama do fluxo completo


Referência rápida de rotas

Todos os endpoints requerem X-Client-ID + X-API-Key, exceto POST /api/v1/checkout/subscriptions/card que usa X-Checkout-Token.