Skip to main content
A cobrança recorrente da UvviPay cobra seus clientes de forma automática e periódica — mensalidades, assinaturas de SaaS, clubes de benefícios ou qualquer serviço com pagamento repetido. Você define o plano uma vez, assina o cliente e a UvviPay cuida do resto: cobra o meio de pagamento (cartão ou PIX), renova o ciclo e avisa você a cada evento.

O que é cobrança recorrente?

Em vez de gerar uma cobrança manual todo mês, você cria um plano (valor, moeda e frequência) e vincula clientes a ele por meio de uma assinatura. A partir daí, a cada ciclo a UvviPay gera uma fatura e cobra o método de pagamento padrão automaticamente. Benefícios:
  • Receita previsível — cobranças automáticas em intervalos fixos.
  • Menos trabalho manual — renovação e retentativas sem intervenção.
  • Pagamento seguro — cartão tokenizado (PCI) ou PIX sem dados sensíveis de cartão.
  • Acompanhamento em tempo real — webhooks para cada mudança de status.

Quando usar

Mensalidades e SaaS

Acesso a plataformas, aplicativos ou APIs com cobrança mensal ou anual.

Clubes e assinaturas

Clubes de benefícios, comunidades, caixas mensais e programas de fidelidade.

Cursos e conteúdo

Cursos, mídia e conteúdo premium com renovação automática.

Contratos de serviço

Manutenção, suporte e prestação de serviço com cobrança periódica.

Conceitos

Como funciona

1

Crie um plano

Defina valor, moeda e frequência (POST /v1/recurrency/plan). A cadência é definida uma vez e não muda depois.
2

Assine o cliente

Envie cliente + meio de pagamento (POST /v1/recurrency/subscription). Sem trial, a primeira cobrança roda no mesmo request (201 se cartão pago, trial ou PIX pendente; 422 / UVV154147 se decline de cartão).
3

Primeira cobrança

Sem trial, o resultado da cobrança já vem na resposta HTTP. Em PIX pendente, aguarde a liquidação via webhook. Webhooks (subscription.activated, subscription.past_due, etc.) cobrem as transições seguintes.
4

Renovação automática

A cada ciclo, a UvviPay gera a próxima fatura e cobra o método de pagamento padrão.

Pré-requisitos

1

Produto habilitado

O produto Recorrência precisa estar ativo para o seu merchant. A ativação é feita pela equipe UvviPay — solicite ao seu contato comercial.
2

Credenciais de API

Use client-id e client-secret no backend. Nunca exponha o client-secret no front-end. Veja Autenticação.
3

Webhooks (recomendado)

Registre um endpoint para receber subscription.* e acompanhar a ativação sem polling agressivo. Veja Webhooks.
Não envie dados de cartão a partir do navegador. Chame os endpoints de assinatura e troca de método de pagamento apenas do seu backend (PCI).

Catálogo (planos)

A cadência do plano (interval / custom_interval) é imutável após a criação. Tentativas de alteração retornam 422 CADENCE_IMMUTABLE.

Assinaturas

Status da assinatura

Exemplo prático

1) Criar um plano mensal

Defina valor, moeda e cadência do plano:
Criar plano

2) Assinar um cliente

Envie o cliente e o meio de pagamento (credit_card ou pix) referenciando o subscription_plan_id. Sem trial, a primeira cobrança roda no mesmo request. Não envie campos de cartão quando type for pix.
Assinar cliente
PIX (sem trial) — payment_methods pode ser apenas { "type": "pix" }. A resposta inclui pix.qrcode.

Respostas da criação

201 — cobrança aprovada (sem trial)

Resposta 201 (cartão pago)

201 — trial (sem cobrança no create)

Com trial, não há cobrança no create (subscription_status: "TRIAL").

422 / UVV154147 — decline de negócio na cobrança sync

A assinatura é criada (PAST_DUE, invoice OPEN), mas a API responde 422 (não 201 com falha embutida):
Resposta 422 UVV154147
Retry manual: reenvie o mesmo POST com o mesmo transaction_idempotency_id e o mesmo payload completo. O replay não duplica a assinatura (invoice permanece OPEN) e inicia uma nova tentativa de cobrança. Alterar o fingerprint do payload retorna 409 / UVV154862. A primeira cobrança não entra em retry automático na fila (auto_charge=false). Detalhes em Criar assinatura.

Webhooks de ciclo de vida

Com um endpoint de webhook registrado, você recebe: Exemplo de payload:
A entrega é at-least-once: o mesmo webhook pode ser reenviado. Use event_id como chave de deduplicação (id é o id da assinatura). Campos de contexto no top-level podem ser null conforme o evento; metadata é o payload bruto do evento. Gerencie endpoints em Webhooks.

Campos importantes

Perguntas frequentes

Não. Na criação da assinatura o cartão é tokenizado com segurança e as cobranças seguintes usam o token. Você nunca guarda o número do cartão.
Na primeira cobrança (create sem trial), a API responde erro HTTP (422 / UVV154147) com subscription_id e invoice_id (invoice OPEN). A assinatura fica PAST_DUE e não entra em retry automático na fila. Para retry manual, reenvie o mesmo POST com o mesmo transaction_idempotency_id e o mesmo payload completo: o replay não duplica a assinatura e inicia uma nova tentativa de cobrança. Se o fingerprint do payload mudar, a API responde 409 / UVV154862. Em renovações, a UvviPay pode retentar conforme a política de soft/hard/grace enquanto auto_charge estiver habilitado.
Sim. Defina o trial no plano (default_trial_unit / default_trial_duration, máx. 31 dias) ou na assinatura (trial_unit / trial_duration). A primeira cobrança ocorre automaticamente ao fim do trial.
Use POST /v1/recurrency/subscription/{id}/cancel. As faturas em aberto são canceladas e a assinatura passa a CANCELLED por ação do usuário. É possível reativar depois com .../reactivate.
Sim. Use POST /v1/recurrency/subscription/{id}/payment-method (apenas do backend) para definir cartão ou PIX como padrão antes do próximo ciclo. Em payment_methods com type: "pix", não envie campos de cartão.
O valor pode ser atualizado no plano, mas a cadência é imutável após a criação (422 CADENCE_IMMUTABLE). Para outra frequência, crie um novo plano.

Boas práticas

  • Trate o retorno do create como síncrono para o desfecho HTTP: 201 (cartão pago, trial ou PIX pendente sem trial) ou 422 / UVV154147 (decline com ids). Em 201, confira subscription_status, charge_status e pix. Em PIX pendente, não liberar o serviço até a liquidação ser confirmada.
  • Use webhooks para transições futuras (renovação, past_due, cancelamento, etc.). Em PIX pendente, confirme a liquidação com subscription.activated e/ou transaction.paid, correlacionando pelo subscription_id ou transaction_id.
  • Guarde subscription_id e transaction_idempotency_id no seu sistema.
  • Em decline na primeira cobrança, reenvie o mesmo POST com o mesmo transaction_idempotency_id e o mesmo payload completo (fingerprint diferente → 409 / UVV154862).
  • Seja idempotente no consumo de webhook — a mesma notificação pode ser reentregue.
  • Reenviar o mesmo transaction_idempotency_id com o mesmo payload devolve a assinatura já criada (não duplica) e, se a invoice seguir OPEN, pode iniciar nova tentativa de cobrança.
  • Troque o meio de pagamento com .../payment-method antes do próximo ciclo quando o cliente atualizar cartão ou PIX.