- 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
Clubes e assinaturas
Cursos e conteúdo
Contratos de serviço
Conceitos
Como funciona
Crie um plano
POST /v1/subscriptions/plan). A frequência é definida uma vez e não muda depois.Assine o cliente
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.Primeira cobrança
subscription.activated,
subscription.past_due e os demais cobrem as mudanças seguintes.Renovação automática
Pré-requisitos
Produto habilitado
Credenciais de API
client-id e client-secret no backend. Nunca exponha o
client-secret no front-end. Veja Autenticação.Webhooks (recomendado)
subscription.* e acompanhar a ativação
sem consultar a API o tempo todo. Veja Webhooks.Catálogo (planos)
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: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.
payment_methods pode ser só { "type": "pix" }. A resposta inclui pix.qrcode.
3) Assinar um cliente que já existe
Cadastre o cliente comPOST /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.
customer_id:
- Crie o cliente com
POST /v1/customerse use oidda resposta. - Ou liste com
GET /v1/customerse use oidde cada item.
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
UVV154640eUVV154718não aparecem. - A busca é na sua conta. Um
customer_idde outra conta responde404. - O cadastro do cliente não muda. Nem
customer_idnemcustomeratualizam quem já está salvo.
Erros do cliente na criação
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.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)
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:
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: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
Preciso armazenar os dados do cartão?
Preciso armazenar os dados do cartão?
O que acontece se uma cobrança falhar?
O que acontece se uma cobrança falhar?
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.Tem período de teste (trial)?
Tem período de teste (trial)?
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.Como cancelo uma assinatura?
Como cancelo uma assinatura?
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.Posso trocar o meio de pagamento de um cliente?
Posso trocar o meio de pagamento de um cliente?
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.Consigo mudar o valor ou a frequência do plano?
Consigo mudar o valor ou a frequência do plano?
422). Para outra frequência, crie um novo plano.Preciso reenviar os dados do cliente em cada assinatura?
Preciso reenviar os dados do cliente em cada assinatura?
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.O mesmo cliente pode ter mais de uma assinatura?
O mesmo cliente pode ter mais de uma assinatura?
customer_id em cada criação. No
mesmo plano, uma segunda assinatura ativa responde 409 / UVV154158.Como atualizo os dados de um cliente já salvo?
Como atualizo os dados de um cliente já salvo?
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) ou422/UVV154147(recusa com ids). Em201, confirasubscription_status,charge_statusepix. 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 comsubscription.activatede/outransaction.paid, pelosubscription_idoutransaction_id. - Guarde
subscription_id,customer_idetransaction_idempotency_id. Com ocustomer_idsalvo, as assinaturas seguintes do mesmo cliente não precisam do blococustomer. - 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
POSTcom o mesmotransaction_idempotency_ide o mesmo payload. Payload diferente responde409/UVV154862. - Trate o webhook como idempotente. A mesma notificação pode chegar de novo.
- Reenviar o mesmo
transaction_idempotency_idcom o mesmo payload devolve a assinatura já criada. Se a fatura ainda estiveropen, a cobrança pode rodar de novo. - Troque o meio de pagamento com
.../payment-methodantes do próximo ciclo, quando o cliente atualizar cartão ou PIX.

