Pular para o conteúdo principal

Assinaturas Recorrentes

O sistema de assinaturas recorrentes da FastPay permite que você cobre automaticamente seus clientes em intervalos regulares, ideal para serviços de assinatura, planos mensais, clubes de benefícios e muito mais.

Visão Geral

O sistema de assinaturas é composto por três entidades principais:

  • Customers: Clientes cadastrados que podem assinar planos
  • Subscription Plans: Planos de assinatura com preço, moeda e recorrência definidos
  • Subscriptions: Assinaturas ativas vinculando um cliente a um plano

Fluxo Completo

O fluxo recomendado é:

Duas Formas de Criar Assinatura

  1. Fluxo Recomendado (Cards-First): Crie o customer, registre o cartão, ative (se necessário), depois crie a subscription usando cardTokenId
  2. Fluxo Inline: Passe os dados do cartão diretamente no paymentMethod ao criar a subscription

Gerenciamento de Customers

Customers são os clientes que podem assinar seus planos. Você pode criar customers previamente ou deixar que sejam criados automaticamente durante o checkout da assinatura.

Criar Customer

curl -X POST "https://api-global.fastpaybrasil.com/v1/customers" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"name": "Joao Silva",
"email": "joao@email.com",
"documentId": "12345678900",
"documentType": "cpf",
"phoneNumber": "+5511999999999"
}'

Resposta:

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q"
}

Campos do Customer

CampoTipoObrigatórioDescrição
namestringSimNome completo do cliente
emailstringSimEmail do cliente
documentIdstringSimNúmero do documento (ex: CPF, CNPJ)
documentTypestringSimTipo do documento (ex: cpf, cnpj, passport)
phoneNumberstringNãoTelefone do cliente

Buscar e Listar Customers

# Listar customers com busca
curl -X GET "https://api-global.fastpaybrasil.com/v1/customers?search=joao&page=1&limit=10" \
-H "Authorization: Basic <seu_token_base64>"

# Buscar customer por ID
curl -X GET "https://api-global.fastpaybrasil.com/v1/customers/2RhQg9M7ZCg3X3nMb9W1kX8Q" \
-H "Authorization: Basic <seu_token_base64>"

Planos de Assinatura

Os planos definem o valor, moeda e frequência das cobranças.

Criar Plano

curl -X POST "https://api-global.fastpaybrasil.com/v1/subscription-plans" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"merchantId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"name": "Plano Premium Mensal",
"price": 99.90,
"currency": "BRL",
"recurrenceType": "monthly",
"buyerMessage": "Bem-vindo ao Plano Premium!",
"paymentMethods": ["credit_card"],
"status": "active"
}'

Tipos de Recorrência

TipoDescrição
weeklyCobrança semanal
biweeklyCobrança quinzenal
monthlyCobrança mensal
customIntervalo customizado em dias

Para recorrência customizada, informe o campo recurrenceInterval (em dias):

{
"recurrenceType": "custom",
"recurrenceInterval": 90
}

Isso criará um plano com cobrança trimestral (a cada 90 dias).

Status do Plano

StatusDescrição
activePlano disponível para novas assinaturas
inactivePlano indisponível para novas assinaturas

Nota: Desativar um plano NÃO afeta assinaturas já existentes. Apenas impede novas assinaturas naquele plano.

Desativar Plano com Assinaturas Ativas

Se o plano tiver assinaturas ativas, será necessário confirmar a desativação:

# Solicitar desativação
curl -X PATCH "https://api-global.fastpaybrasil.com/v1/subscription-plans/ID_DO_PLANO/status" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{"status": "inactive"}'

Resposta quando há assinaturas ativas:

{
"requiresConfirmation": true,
"confirmationToken": "abc123xyz",
"activeSubscriptionsCount": 150,
"message": "Este plano possui 150 assinaturas ativas. Confirme a desativação."
}
# Confirmar desativação
curl -X PATCH "https://api-global.fastpaybrasil.com/v1/subscription-plans/ID_DO_PLANO/status/confirm" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{"confirmationToken": "abc123xyz"}'

Registrar Cartão (Cards-First)

O fluxo recomendado é registrar o cartão antes de criar a assinatura, usando a API de Cards.

Registrar o Cartão

curl -X POST "https://api-global.fastpaybrasil.com/v1/cards" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"merchantId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"number": "4111111111111111",
"holderName": "JOAO SILVA",
"expirationMonth": "12",
"expirationYear": "2028",
"cvv": "123",
"validateCard": true
}'

Resposta (com validateCard=true):

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "pending_validation",
"cardBrand": "visa",
"cardLastFour": "1111",
"cardExpMonth": "12",
"cardExpYear": "2028"
}

Ativar o Cartão

Se o cartão foi registrado com validateCard: true, você precisa ativá-lo antes de usar em assinaturas:

curl -X POST "https://api-global.fastpaybrasil.com/v1/cards/CARD_TOKEN_ID/activate" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"activationValue": "1.50"
}'

Nota: Para mais detalhes sobre a API de Cards, consulte a referência da API de Cards.

Criar Assinatura (Checkout)

Para criar uma assinatura, você precisa de um plano ativo e um cartão de pagamento.

Existem duas formas de fornecer o cartão:

  1. Usar cardTokenId (recomendado): Use um cartão já registrado e ativado
  2. Usar paymentMethod: Passe os dados do cartão inline (cria um novo cartão)

Existem duas formas de identificar o cliente:

  1. Passar customerId: Reutiliza um customer já cadastrado
  2. Passar objeto customer: Cria um novo customer ou localiza pelo email

Validação de Cartão (validateCard)

Por padrão, o cartão é validado antes de ativar a assinatura (validateCard: true). Isso significa:

  1. Uma transação de teste de até R$ 2,00 é feita no cartão
  2. A assinatura é criada com status pending_card_activation
  3. O cliente deve verificar o valor na fatura do cartão
  4. O endpoint /cards/{cardTokenId}/activate deve ser chamado com o valor
  5. Após a ativação, o valor de teste é estornado automaticamente e a primeira cobrança da assinatura é processada

Se validateCard: false, o cartão não é validado e a primeira cobrança é processada imediatamente.

Recomendação: Mantenha validateCard: true (padrão) para maior segurança e menor risco de cobranças recusadas.

Opção 1: Usando cardTokenId (Recomendado - Cards-First)

Use um cartão já registrado e ativado:

curl -X POST "https://api-global.fastpaybrasil.com/v1/subscriptions" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingDay": 15,
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"cardTokenId": "2RhQg9M7ZCg3X3nMb9W1kX8Q"
}'

Resposta:

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "active",
"cardTokenId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"currentPeriodStart": "2024-01-15T10:30:00.000Z",
"currentPeriodEnd": "2024-02-15T10:30:00.000Z",
"billingDay": 15,
"firstCharge": {
"success": true,
"nsuOperacao": "123456789",
"codigoAutorizacao": "ABC123",
"message": "Transaction approved"
}
}

Importante: O cartão deve estar com status active. Se o cartão estiver pending_validation, você receberá erro 400 - Card is pending activation.

Opção 2: Usando paymentMethod (cartão novo inline)

curl -X POST "https://api-global.fastpaybrasil.com/v1/subscriptions" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingDay": 15,
"customerId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"validateCard": true,
"paymentMethod": {
"number": "4111111111111111",
"holderName": "JOAO SILVA",
"expirationMonth": "12",
"expirationYear": "2028",
"cvv": "123"
}
}'

Opção 3: Usando objeto customer (novo cliente ou busca por email)

curl -X POST "https://api-global.fastpaybrasil.com/v1/subscriptions" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"subscriptionPlanId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingDay": 15,
"customer": {
"name": "Joao Silva",
"email": "joao@email.com",
"document": {
"type": "cpf",
"id": "12345678900"
},
"phoneNumber": "+5511999999999"
},
"paymentMethod": {
"number": "4111111111111111",
"holderName": "JOAO SILVA",
"expirationMonth": "12",
"expirationYear": "2028",
"cvv": "123"
},
"metadata": {
"referralCode": "PROMO2024"
}
}'

Nota: Você deve informar customerId OU customer, não ambos. Se usar customer, o sistema irá buscar um cliente existente pelo email ou criar um novo.

Resposta (com validateCard=true):

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "pending_card_activation",
"cardTokenId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"currentPeriodStart": "2024-01-15T10:30:00.000Z",
"currentPeriodEnd": "2024-02-15T10:30:00.000Z",
"billingDay": 15,
"cardActivation": {
"required": true,
"message": "Verifique o valor da transacao de teste na fatura do cartao e use o endpoint /cards/:cardTokenId/activate"
}
}

Resposta (com validateCard=false):

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "active",
"cardTokenId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"currentPeriodStart": "2024-01-15T10:30:00.000Z",
"currentPeriodEnd": "2024-02-15T10:30:00.000Z",
"billingDay": 15,
"firstCharge": {
"success": true,
"nsuOperacao": "123456789",
"codigoAutorizacao": "ABC123",
"message": "Transaction approved"
}
}

Dia de Cobrança (billingDay)

O campo billingDay define em qual dia do mês a cobrança será realizada (1-28). Se não informado, usa o dia atual.

Importante: O limite é 28 para evitar problemas com meses que têm menos de 31 dias.

O que acontece no checkout

Com validateCard: true (padrão):

  1. O plano de assinatura é validado
  2. O customer é criado ou localizado pelo email
  3. O cartão é registrado no token vault
  4. Uma transação de teste (até R$ 2,00) é feita no cartão
  5. A assinatura é criada com status pending_card_activation
  6. O cliente deve ativar o cartão usando o endpoint /cards/{cardTokenId}/activate
  7. Após ativação, a primeira cobrança é processada automaticamente

Com validateCard: false:

  1. O plano de assinatura é validado
  2. O customer é criado ou localizado pelo email
  3. O cartão é registrado no token vault
  4. A primeira cobrança é efetuada imediatamente
  5. A assinatura é armazenada com status active (se cobrança bem-sucedida)

Ativar Cartão da Assinatura

Quando a assinatura é criada com validateCard: true, o cartão precisa ser ativado antes de processar a primeira cobrança.

Como funciona

  1. O cliente verifica a fatura do cartão e localiza a transação de teste (até R$ 2,00)
  2. O valor exato da transação é informado no endpoint de ativação de cartões
  3. Após confirmação, o cartão é ativado, o valor de teste é estornado
  4. Todas as assinaturas pendentes usando esse cartão têm a primeira cobrança processada automaticamente

Endpoint de Ativação

Use o endpoint de ativação de cartões (/cards/{id}/activate):

curl -X POST "https://api-global.fastpaybrasil.com/v1/cards/CARD_TOKEN_ID/activate" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"activationValue": "1.50"
}'

Importante: O activationValue deve ser o valor decimal exato mostrado na fatura (ex: "1.50", "0.75"), NÃO em centavos.

Resposta:

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "active",
"processedSubscriptions": [
{
"subscriptionId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "active",
"success": true,
"nsuOperacao": "123456789",
"message": "First charge processed successfully"
}
]
}

Ciclo de Vida da Assinatura

Status da Assinatura

StatusDescrição
pending_card_activationAguardando ativação do cartão (quando validateCard=true)
pending_activationAguardando ativação (cobrança inicial falhou)
activeAtiva e em dia
cancelledCancelada pelo usuário ou sistema
pausedPausada temporariamente
expiredExpirada (fim do plano ou falhas consecutivas)

Atualizar Assinatura

Você pode atualizar dados de uma assinatura ativa:

curl -X PATCH "https://api-global.fastpaybrasil.com/v1/subscriptions/ID_DA_ASSINATURA" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"billingDay": 20,
"metadata": {
"notes": "Cliente VIP"
}
}'

Campos atualizáveis:

CampoTipoDescrição
billingDayintegerDia do mês para cobrança (1-28)
metadataobjectMetadados adicionais da assinatura

Cancelamento

O cancelamento possui lógica de período de arrependimento conforme legislação brasileira.

curl -X POST "https://api-global.fastpaybrasil.com/v1/subscriptions/ID_DA_ASSINATURA/cancel" \
-H "Authorization: Basic <seu_token_base64>" \
-H "Content-Type: application/json" \
-d '{
"reason": "Cliente solicitou cancelamento"
}'

Período de Arrependimento (até 7 dias)

Se o cancelamento ocorrer em até 7 dias após a criação:

  • Estorno total e automático do valor pago
  • Acesso revogado imediatamente
  • cancellationType: regret
  • refunded: true

Resposta:

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "cancelled",
"cancellationType": "regret",
"refunded": true,
"refundId": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"accessRevokedAt": "2024-01-16T10:30:00.000Z"
}

Cancelamento Regular (após 7 dias)

Se o cancelamento ocorrer após 7 dias:

  • Sem estorno automático
  • Acesso continua até o fim do período atual
  • Não serão geradas novas cobranças
  • cancellationType: regular
  • refunded: false

Resposta:

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "cancelled",
"cancellationType": "regular",
"refunded": false,
"accessRevokedAt": "2024-02-15T10:30:00.000Z"
}

Histórico de Cobranças

Ao buscar uma assinatura por ID, você recebe o histórico completo de cobranças:

curl -X GET "https://api-global.fastpaybrasil.com/v1/subscriptions/ID_DA_ASSINATURA" \
-H "Authorization: Basic <seu_token_base64>"

Resposta (parcial):

{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"status": "active",
"charges": [
{
"id": "2RhQg9M7ZCg3X3nMb9W1kX8Q",
"billingCycle": 1,
"billingPeriodStart": "2024-01-15T10:30:00.000Z",
"billingPeriodEnd": "2024-02-15T10:30:00.000Z",
"amount": 99.90,
"currency": "BRL",
"status": "paid",
"pspTransactionId": "12345",
"createdAt": "2024-01-15T10:30:00.000Z"
}
]
}

Status das Cobranças

StatusDescrição
pendingAguardando processamento
paidPaga com sucesso
failedFalhou
refundedEstornada
skippedPulada/ignorada

Boas Práticas

1. Validar o Plano Antes do Checkout

Antes de direcionar o usuário para o checkout, verifique se o plano está ativo:

curl -X GET "https://api-global.fastpaybrasil.com/v1/subscription-plans/ID_DO_PLANO" \
-H "Authorization: Basic <seu_token_base64>"

2. Tratar Falhas na Cobrança Inicial

Se a cobrança inicial falhar, a assinatura terá status pending_activation. Implemente um fluxo para que o usuário tente novamente com outro cartão.

3. Informar o Cliente sobre Renovação

Envie lembretes ao cliente alguns dias antes da renovação automática.

4. Manter Dados de Pagamento Atualizados

Se o cartão do cliente expirar, a cobrança falhará. Implemente um fluxo para atualização de dados de pagamento.

5. Usar Metadata para Informações Adicionais

O campo metadata permite armazenar informações customizadas na assinatura:

{
"metadata": {
"referralCode": "PROMO2024",
"campaignId": "black-friday",
"internalUserId": "12345"
}
}

Webhooks de Assinatura

A FastPay envia webhooks automáticos para eventos importantes no ciclo de vida das assinaturas:

EventoQuando é enviado
subscription.createdNova assinatura criada
subscription.activatedPrimeira cobrança bem-sucedida
subscription.renewedCobrança recorrente processada
subscription.payment_failedFalha na cobrança recorrente
subscription.cancelledAssinatura cancelada
subscription.pausedAssinatura pausada
subscription.expiredAssinatura expirada

Para mais detalhes sobre configuração e payloads, consulte a documentação de Webhooks de Assinatura.

Próximos Passos