Skip to main content
A cobrança recorrente da UvviPay cobra de novo no intervalo que você escolher: mensalidade, SaaS, clube ou outro serviço com pagamento repetido. Você cria o plano uma vez (valor, moeda e frequência) e depois assina o cliente. A cada ciclo a UvviPay gera uma fatura, cobra o método padrão e avisa por webhook.
  • Cobrança em intervalos fixos.
  • Renovação e novas tentativas sem você ter que intervir.
  • Cartão tokenizado (PCI) ou PIX, sem guardar dados de cartão.
  • Webhook a 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/subscriptions/plan). A frequência é definida uma vez e não muda depois.
2

Assine o cliente

Envie o cliente e o meio de pagamento (POST /v1/subscriptions). Se o cliente já estiver cadastrado, prefira customer_id. O bloco customer também reaproveita o cadastro pelo external_customer_id. Sem trial, a primeira cobrança acontece neste request (201 se cartão pago ou PIX pendente; 422 / UVV154147 se o cartão for recusado). Se o trial for aceito, a API responde 201 sem cobrança inicial. A primeira cobrança acontece no fim do trial. Em pix_type: automatic, o trial deve terminar no mínimo em 3 dias. Duração menor responde 422 / UVV154490.
3

Primeira cobrança

Sem trial, o resultado da cobrança já vem na resposta HTTP. Em PIX pendente, aguarde a confirmação pelo webhook. Os eventos subscription.activated, subscription.past_due e os demais cobrem as mudanças 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 na sua conta. A equipe UvviPay faz a ativação. Peça 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)

Cadastre um endpoint para receber subscription.* e acompanhar a ativação sem consultar a API o tempo todo. Veja Webhooks.
Não envie dados de cartão a partir do navegador. Chame os endpoints de assinatura e de troca de método de pagamento só do seu backend (PCI).

Catálogo (planos)

A frequência do plano (interval / custom_interval) não muda depois da criação. Se você tentar alterar, a API responde 422.

Assinaturas

Faturas

Clientes

Status da assinatura

Exemplo prático

1) Criar um plano mensal

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

2) Assinar um cliente

Envie o cliente e o meio de pagamento (credit_card ou pix) com o subscription_plan_id. Sem trial, a primeira cobrança acontece neste request. Não envie dados de cartão quando type for pix.
Assinar cliente
PIX sem trial: payment_methods pode ser só { "type": "pix" }. A resposta inclui pix.qrcode.

3) Assinar um cliente que já existe

Cadastre o cliente com POST /v1/customers. Guarde o id. Na criação da assinatura, envie esse valor em customer_id e não reenvie os dados do cliente. A criação aceita duas formas de identificar o cliente. Envie uma. Nunca as duas. Para obter o customer_id:
  1. Crie o cliente com POST /v1/customers e use o id da resposta.
  2. Ou liste com GET /v1/customers e use o id de cada item.
Assinar cliente existente
O resto da criação não muda. Plano, payment_methods, trial, carência e idempotência funcionam igual nas duas formas.

O que muda com customer_id

  • A API não olha nome, e-mail, telefone nem documento. Por isso UVV154640 e UVV154718 não aparecem.
  • A busca é na sua conta. Um customer_id de outra conta responde 404.
  • O cadastro do cliente não muda. Nem customer_id nem customer atualizam quem já está salvo.

Erros do cliente na criação

Pix Automático (pix_type: automatic) pede endereço completo: zip_code, street, street_number, neighborhood, city, state e country.Se o cliente já está salvo sem endereço, customer_id não resolve. A API responde 422 / UVV154361 e não cria a assinatura.Cadastre o endereço na primeira assinatura. Não há endpoint público para atualizar o cadastro depois. Enviar customer com address vale só para aquela criação: o cliente que já existe continua sem endereço.PIX imediato e cartão não pedem endereço.
O endereço dentro de customer é opcional. Se você enviar address, preencha todos os campos. Se faltar algum, a API responde 400. Envie o endereço na primeira assinatura se pretende usar Pix Automático depois.
A idempotência considera a forma de identificar o cliente. Para repetir a chamada com o mesmo transaction_idempotency_id, envie o mesmo payload. Se a primeira chamada enviou o bloco customer e a nova enviar customer_id, a API responde 409 / UVV154862.

Respostas da criação

201: cobrança aprovada (sem trial)

Resposta 201 (cartão pago)

201: trial (sem cobrança na criação)

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

422 / UVV154147: cartão recusado na primeira cobrança

A assinatura é criada mesmo assim (PAST_DUE, fatura open). A API responde 422, não 201:
Resposta 422 UVV154147
Para tentar de novo, reenvie o mesmo POST com o mesmo transaction_idempotency_id e o mesmo payload. A API não cria outra assinatura. Se a fatura ainda estiver open, a cobrança roda de novo. Payload diferente responde 409 / UVV154862. Detalhes em Criar assinatura.

Webhooks de ciclo de vida

Com um endpoint de webhook cadastrado, você recebe: Exemplo de payload:
O mesmo webhook pode chegar mais de uma vez. Use event_id para ignorar duplicata. O campo id é o id da assinatura. Alguns campos no topo podem vir null, conforme o evento. Gerencie endpoints em Webhooks.

Campos importantes

Perguntas frequentes

Não. Na criação da assinatura o cartão é tokenizado. As cobranças seguintes usam o token. Você nunca guarda o número do cartão.
Na primeira cobrança (criação sem trial), a API responde 422 / UVV154147 com subscription_id e invoice_id (fatura open). A assinatura fica PAST_DUE. Para tentar de novo, reenvie o mesmo POST com o mesmo transaction_idempotency_id e o mesmo payload. A API não cria outra assinatura. Payload diferente responde 409 / UVV154862. Nas renovações, a UvviPay pode tentar de novo enquanto a assinatura estiver em atraso.
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 acontece no fim do trial.
Use POST /v1/subscriptions/{id}/cancel. As faturas open passam a void e a assinatura fica CANCELLED por ação do cliente. Dá para reativar depois com .../reactivate.
Sim. Use POST /v1/subscriptions/{id}/payment-method (só 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 dados de cartão.
O valor pode ser atualizado no plano. A frequência não muda depois da criação (422). Para outra frequência, crie um novo plano.
Não. Se o cliente já estiver cadastrado, inclusive por POST /v1/customers, prefira customer_id desde a primeira assinatura. O bloco customer também vale: a API reaproveita o cadastro pelo external_customer_id. As duas formas são exclusivas: envie uma ou outra. Os dois juntos respondem 400.
Sim, em planos diferentes. Use o mesmo customer_id em cada criação. No mesmo plano, uma segunda assinatura ativa responde 409 / UVV154158.
A criação da assinatura não atualiza o cliente. Enviar o bloco customer com o mesmo external_customer_id e dados diferentes responde 422 / UVV154640. Para corrigir o cadastro, fale com o suporte UvviPay.

Boas práticas

  • Trate a criação pelo status HTTP: 201 (cartão pago, trial ou PIX pendente) ou 422 / UVV154147 (recusa com ids). Em 201, confira subscription_status, charge_status e pix. Em PIX pendente, não libere o serviço até a confirmação do pagamento.
  • Use webhooks para as mudanças seguintes (renovação, past_due, cancelamento). Em PIX pendente, confirme com subscription.activated e/ou transaction.paid, pelo subscription_id ou transaction_id.
  • Guarde subscription_id, customer_id e transaction_idempotency_id. Com o customer_id salvo, as assinaturas seguintes do mesmo cliente não precisam do bloco customer.
  • Cadastre o cliente com endereço completo na primeira assinatura se você pretende usar Pix Automático depois. Sem endereço, a API responde 422 / UVV154361.
  • Se a primeira cobrança for recusada, reenvie o mesmo POST com o mesmo transaction_idempotency_id e o mesmo payload. Payload diferente responde 409 / UVV154862.
  • Trate o webhook como idempotente. A mesma notificação pode chegar de novo.
  • Reenviar o mesmo transaction_idempotency_id com o mesmo payload devolve a assinatura já criada. Se a fatura ainda estiver open, a cobrança pode rodar de novo.
  • Troque o meio de pagamento com .../payment-method antes do próximo ciclo, quando o cliente atualizar cartão ou PIX.