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.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
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
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:
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
Preciso armazenar os dados do cartão?
Preciso armazenar os dados do cartão?
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.
O que acontece se uma cobrança falhar?
O que acontece se uma cobrança falhar?
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.Tem período de teste (trial)?
Tem período de teste (trial)?
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.Como cancelo uma assinatura?
Como cancelo uma assinatura?
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.Posso trocar o meio de pagamento de um cliente?
Posso trocar o meio de pagamento de um cliente?
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.Consigo mudar o valor ou a frequência do plano?
Consigo mudar o valor ou a frequência do plano?
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) ou422/UVV154147(decline com ids). Em201, confirasubscription_status,charge_statusepix. 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 comsubscription.activatede/outransaction.paid, correlacionando pelosubscription_idoutransaction_id. - Guarde
subscription_idetransaction_idempotency_idno seu sistema. - Em decline na primeira cobrança, reenvie o mesmo
POSTcom o mesmotransaction_idempotency_ide 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_idcom o mesmo payload devolve a assinatura já criada (não duplica) e, se a invoice seguirOPEN, pode iniciar nova tentativa de cobrança. - Troque o meio de pagamento com
.../payment-methodantes do próximo ciclo quando o cliente atualizar cartão ou PIX.

