Pular para o conteúdo principal

Criar assinatura com cartão

POST/api/v1/subscriptions/
{
"value": 2990,
"cycle": "MONTHLY",
"nextDueDate": "2026-10-15",
"endDate": "2027-10-01",
"description": "Plano Premium",
"externalReference": "cliente_123",
"payerName": "Joao da Silva",
"payerDocument": "52998224725",
"payerEmail": "[email protected]",
"payerPhone": "11999999999",
"cardNumber": "4111111111111111",
"cvv": "123",
"expirationDate": "12/2028",
"cardHolder": "JOAO DA SILVA",
"callbackUrl": "https://meu-sistema.com/webhook/subscription"
}
CampoTipoObrigatórioDescrição
valueintegerSimValor em centavos, inteiro de 1 a 2147483647. R$ 29,90 = 2990
cyclestringSimCiclo de cobrança, em maiúsculas — ver Referência de status
nextDueDatestringSimPrimeiro vencimento, YYYY-MM-DD. Hoje ou depois, no horário de Brasília
endDatestringNãoData final, YYYY-MM-DD, igual ou posterior a nextDueDate. Omitido → roda indefinidamente
descriptionstringNãoDescrição da assinatura. Máx. 255 caracteres
externalReferencestringNãoReferência no seu sistema. Máx. 100 caracteres. Recomendado: o ID do cliente no seu cadastro (ver Escopo da plataforma)
payerNamestringSimNome completo do pagador. Máx. 100 caracteres
payerDocumentstringSimCPF ou CNPJ com dígito verificador válido, com ou sem pontuação. Máx. 20 caracteres
payerEmailstringNãoE-mail do pagador. Máx. 100 caracteres
payerPhonestringNãoTelefone do pagador. Máx. 20 caracteres
callbackUrlstringNãoURL dos webhooks da seção Webhooks de cobrança. HTTPS público (veja as regras do endpoint), ou vazio para desligar. Máx. 500 caracteres
CartãoCondicionalUma das três formas abaixo, ou nenhuma (Caminho B)
aviso

Campos que esta rota não conhece são ignorados. Isso é diferente da edição (Atualizar assinatura), que recusa campos não editáveis. Não envie campos fora desta tabela: eles não têm efeito e podem passar a ser recusados no futuro, com aviso.

Validações antes de qualquer cobrança​

Estas regras são conferidas antes de chamar o adquirente. Nenhuma delas cria a assinatura.

SituaçãoResposta 400
value com fração, zero, negativo ou acima de 2147483647Invalid value (expected positive integer cents, max 2147483647)
nextDueDate anterior a hojenextDueDate não pode ser anterior a hoje
endDate anterior a nextDueDateendDate precedes nextDueDate
cycle fora da lista da seção Referência de statuscycle inválido (use WEEKLY, BIWEEKLY, MONTHLY, QUARTERLY, SEMIANNUALLY ou YEARLY)
payerDocument que não é CPF nem CNPJ válidopayerDocument inválido (informe um CPF ou CNPJ válido)
callbackUrl que não é HTTPS públicocallbackUrl must be a safe public HTTPS URL
Texto maior que o limite da tabela<campo> excede <n> caracteres
Bandeira não reconhecida pelo númeroBandeira do cartão não reconhecida
Número do cartão com dígito verificador inválidoNúmero do cartão inválido
expirationDate fora de MM/AAAA (ou MM/AA) ou com mês fora de 01–12Data de validade inválida (use MM/AAAA)
Cartão vencidoCartão vencido
Por que a data passada é recusada

Sem essa regra, uma assinatura com vencimento três meses atrás nascia ACTIVE e o processamento cobrava todos os ciclos atrasados. Mesmo que uma assinatura fique atrasada por outro motivo, a YumePay não cobra ciclos em lote (Processamento das cobranças).

As três formas de informar o cartão​

FormaCamposQuando usar
Em clarocardNumber, cvv, expirationDate (MM/YYYY), cardHolderSeu servidor recebe o cartão. Os quatro campos andam juntos
CriptografadoencryptedCardData (ou encrypted_card_data)O cartão é cifrado no navegador e seu servidor nunca vê o número. Mesma chave, padding e JSON da seção Montar o seu próprio checkout, passo 1. Nenhum campo em claro é necessário
ReaproveitadosourceSubscriptionIdO mesmo pagador já tem outra assinatura com cartão. O cartão dela é copiado, sem pedir os dados de novo

Exemplo com cartão criptografado​

{
"value": 2990,
"cycle": "MONTHLY",
"nextDueDate": "2026-10-15",
"payerName": "Joao da Silva",
"payerDocument": "52998224725",
"encryptedCardData": "base64_da_criptografia_RSA..."
}

Exemplo reaproveitando o cartão de outra assinatura do mesmo pagador​

{
"value": 4990,
"cycle": "MONTHLY",
"nextDueDate": "2026-10-15",
"payerName": "Joao da Silva",
"payerDocument": "52998224725",
"sourceSubscriptionId": 12
}

Envie só uma forma. Combinar duas devolve 400 Envie apenas uma forma de cartão.

Regras do reaproveitamento (sourceSubscriptionId)​

SituaçãoResposta
Origem do mesmo lojista, com cartão, mesmo payerDocument válidoCartão copiado. Sem nova tokenização
Origem com outro payerDocument, sem documento ou com documento inválido409 Source subscription belongs to a different payer
Origem sem cartão tokenizado (ex.: ainda PENDING_PAYMENT)409 Source subscription has no reusable card
Origem de outro lojista403
Origem inexistente404
  • A titularidade é validada pela YumePay: um cartão nunca é vinculado a outro pagador. A comparação usa só os dígitos — 529.982.247-25 e 52998224725 são o mesmo documento — e exige um CPF ou CNPJ válido.
  • A origem pode estar em qualquer status, inclusive cancelada — útil para recontratar um cliente sem pedir o cartão de novo.
  • As duas assinaturas passam a usar o mesmo cartão. Trocar o cartão de uma (Trocar o cartão) não altera a outra.

Cartão recusado na criação​

Há dois momentos em que a recusa pode acontecer, com respostas diferentes:

MomentoRespostaA assinatura
Na tokenização — o adquirente rejeita o cartão em si422 CARD_REJECTED com o motivo em denial (Respostas de erro)Não é criada
Na primeira cobrança — o cartão tokeniza, mas a cobrança do dia é negada (só quando nextDueDate é hoje)201 com status: 0, lastChargeStatus: "DENIED" e consecutiveDeniedCharges: 1É criada ACTIVE, sem valor capturado
aviso

Na criação com vencimento hoje, confira lastChargeStatus na resposta 201. "CONFIRMED" = primeira cobrança aprovada; "DENIED" = assinatura criada, mas nada capturado. Nesse caso, a decisão é sua: pedir outro cartão (Trocar o cartão), aguardar a retentativa (Retentativa de cobrança negada) ou cancelar (Cancelar assinatura). O motivo da recusa está na cobrança (Listar cobranças de uma assinatura) e chega no webhook charge.denied.

Os casos que o adquirente recusaria na tokenização sem motivo útil (número inválido, validade inválida, cartão vencido) já são barrados antes, com 400 e mensagem própria. O 422 fica para recusas que só o adquirente pode decidir. 502 indica falha de comunicação com o adquirente, não recusa — pode repetir.

Resposta 201
{
"status": "success",
"data": {
"id": 12,
"merchantId": 2,
"status": 0,
"value": 2990,
"amount": 29.9,
"cycle": "MONTHLY",
"nextDueDate": "2026-10-15",
"endDate": "2027-10-01",
"description": "Plano Premium",
"externalReference": "cliente_123",
"payerName": "Joao da Silva",
"payerDocument": "52998224725",
"payerEmail": "[email protected]",
"payerPhone": "11999999999",
"cardLastFour": "1111",
"cardBrand": "Visa",
"cardExp": "12/2028",
"callbackUrl": "https://meu-sistema.com/webhook/subscription",
"paymentGuid": "",
"paymentUrl": "",
"lastChargeStatus": null,
"lastChargeAt": null,
"consecutiveDeniedCharges": 0,
"createdAt": "2026-10-09T12:48:57.28966Z",
"updatedAt": "2026-10-09T12:48:57.28966Z"
}
}

Se o vencimento for hoje, a cobrança já foi feita quando você recebe esta resposta: com aprovação, nextDueDate já aponta para o próximo ciclo e lastChargeStatus vem "CONFIRMED".