Pagamento
Trocar cartão ou método de pagamento
Troca o cartão ou a forma de pagamento da assinatura. Também é o caminho para regularizar uma assinatura com cobrança vencida usando um cartão novo.
/v1/subscriptions/:subscriptionId/payment-methodhttps://api.validapay.com.brhttps://sandbox.validapay.com.brTrocar o cartão com a assinatura em dia: envie paymentMethod: "creditcard" e o cardToken do cartão novo. As próximas cobranças usam o cartão novo; nada é cobrado agora.
Assinatura com cobrança vencida (PAST_DUE ou DEFAULT):
- Com
cardToken: cobra na hora todas as faturas vencidas, uma por vez, da mais antiga para a mais nova, e passa a usar o cartão novo. Se uma recusa, as seguintes não são tentadas e a resposta traz o link da fatura que ficou em aberto. A assinatura volta aACTIVEquando não sobra nenhuma fatura vencida. - Sem
cardToken: devolve o link da fatura (checkoutUrl) para o cliente informar o cartão e pagar sozinho.
Dados do cartão: nunca envie o número do cartão para esta rota.
- Tokenize o cartão com o SDK de tokenização (veja SDKs › Tokenização). O
cardTokenvale por 5 minutos. - Envie o
deviceIdgerado pelo SDK (fingerprint do dispositivo); ele é usado na análise antifraude. - Se a conta exige 3DS, autentique com o SDK de 3DS e envie
authentication.authenticationId.
Pix, boleto e Pix Automático: envie paymentMethod com applyTo. Com NEXT_CYCLE a troca vale a partir da próxima cobrança; com CURRENT_CYCLE a cobrança em aberto é reemitida na forma nova. O boleto antigo não é cancelado, a menos que você envie cancelOpenBoleto: true. No Pix Automático a resposta traz o link para o cliente autorizar o débito no banco.
Envie
dryRun: truecom ocardTokenpara ver quais faturas serão cobradas e o total, sem cobrar.
Authorizations
Authorization
string obrigatório
Cabeçalho de autenticação Bearer no formato Bearer {{token}} onde {{token}} é o seu token OAuth2.
Escopos requeridos
Path Parameters
subscriptionIdstringobrigatórioBody
application/json
{
"paymentMethod": "creditcard",
"cardToken": "ctk_xxx",
"deviceId": "dfp_xxx",
"authentication": {
"authenticationId": "auth_xxx"
},
"applyTo": "CURRENT_CYCLE",
"dueDate": "2026-09-30",
"cancelOpenBoleto": false,
"dryRun": false
}Schema
paymentMethodstringobrigatóriocreditcardpixboletopix_automaticocardTokenstringopcionaldeviceIdstringopcionalauthenticationobjectopcionalapplyTostringopcionalCURRENT_CYCLENEXT_CYCLEdueDatestringopcional^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$cancelOpenBoletobooleanopcionaldryRunbooleanopcionalconst url = 'https://sandbox.validapay.com.br/v1/subscriptions/:subscriptionId/payment-method';
const options = {
method: 'PUT',
headers: {
'Authorization': 'Bearer {{token}}',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"paymentMethod": "creditcard",
"cardToken": "ctk_xxx",
"deviceId": "dfp_xxx",
"authentication": {
"authenticationId": "auth_xxx"
},
"applyTo": "CURRENT_CYCLE",
"dueDate": "2026-09-30",
"cancelOpenBoleto": false,
"dryRun": false
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));Response Examples
200faturas vencidas cobradas no cartão▾
{
"success": true,
"type": "CARD_CHARGED",
"subscriptionId": "sub_xxx",
"paymentType": "CREDIT_CARD",
"paymentMethodId": "pm_xxx",
"appliedTo": "CURRENT_CYCLE",
"totalCharged": 220.0,
"cycles": [
{
"cycleNumber": 2,
"invoiceId": "inv_2",
"amount": 100.0,
"dueDate": "2026-08-10",
"status": "PAID",
"chargeId": "cha_xxx"
},
{ "cycleNumber": 3, "invoiceId": "inv_3", "amount": 120.0, "dueDate": "2026-09-10", "status": "PAID", "chargeId": "cha_yyy" }
]
}Campos da resposta
successbooleantypestringCARD_CHARGEDPARTIALLY_CHARGEDsubscriptionIdstringpaymentTypestringpaymentMethodIdstringappliedTostringtotalChargednumbercyclesarray[2]200cobrança parcial▾
{
"success": true,
"type": "PARTIALLY_CHARGED",
"subscriptionId": "sub_xxx",
"paymentType": "CREDIT_CARD",
"paymentMethodId": "pm_xxx",
"appliedTo": "CURRENT_CYCLE",
"totalCharged": 100.0,
"cycles": [
{ "cycleNumber": 2, "invoiceId": "inv_2", "amount": 100.0, "dueDate": "2026-08-10", "status": "PAID", "chargeId": "cha_xxx" },
{
"cycleNumber": 3,
"invoiceId": "inv_3",
"amount": 120.0,
"dueDate": "2026-09-10",
"status": "DECLINED",
"chargeId": "cha_yyy",
"declineCode": "insufficient_funds",
"declineReason": "Cartão recusado por saldo insuficiente"
}
],
"checkoutUrl": "https://app.validapay.com.br/fatura/inv_3"
}Campos da resposta
successbooleantypestringsubscriptionIdstringpaymentTypestringpaymentMethodIdstringappliedTostringtotalChargednumbercyclesarray[2]checkoutUrlstring200prévia (dryRun)▾
{
"success": true,
"type": "PREVIEW",
"subscriptionId": "sub_xxx",
"paymentType": "CREDIT_CARD",
"total": 220.0,
"cycles": [
{
"cycleNumber": 2,
"invoiceId": "inv_2",
"amount": 100.0,
"dueDate": "2026-08-10"
},
{ "cycleNumber": 3, "invoiceId": "inv_3", "amount": 120.0, "dueDate": "2026-09-10" }
]
}Campos da resposta
successbooleantypestringsubscriptionIdstringpaymentTypestringtotalnumbercyclesarray[2]200link para o cliente informar o cartão▾
{
"success": true,
"type": "CARD_COLLECTION_REQUIRED",
"subscriptionId": "sub_xxx",
"paymentType": "BOLETO",
"appliedTo": "CURRENT_CYCLE",
"invoiceId": "inv_3",
"checkoutUrl": "https://app.validapay.com.br/fatura/inv_3",
"message": "Envie o link ao cliente para que ele informe os dados do cartão"
}Campos da resposta
successbooleantypestringsubscriptionIdstringpaymentTypestringappliedTostringinvoiceIdstringcheckoutUrlstringmessagestring200forma de pagamento trocada▾
{
"success": true,
"type": "PAYMENT_METHOD_CHANGED",
"subscriptionId": "sub_xxx",
"paymentType": "PIX",
"paymentMethodId": null,
"appliedTo": "NEXT_CYCLE",
"reason": "SCOPED_TO_NEXT_CYCLE",
"reissued": null,
"updatedCycles": [3]
}Campos da resposta
successbooleantypestringPAYMENT_METHOD_CHANGEDNO_CHANGEsubscriptionIdstringpaymentTypestringCREDIT_CARDPIXBOLETOPIX_AUTOMATICOpaymentMethodIdobjectappliedTostringNEXT_CYCLECURRENT_CYCLEreasonstringNO_OPEN_CHARGESAME_PAYMENT_METHODSCOPED_TO_NEXT_CYCLEreissuedobjectupdatedCyclesarray[1]400cartão recusado▾
{
"error": {
"message": "Cartão recusado por saldo insuficiente",
"code": "PAYMENT_DECLINED",
"details": { "cycles": [ { "cycleNumber": 2, "invoiceId": "inv_2", "amount": 100.0, "dueDate": "2026-08-10", "status": "DECLINED", "chargeId": "cha_xxx", "declineCode": "insufficient_funds", "declineReason": "Cartão recusado por saldo insuficiente" }, { "cycleNumber": 3, "invoiceId": "inv_3", "amount": 120.0, "dueDate": "2026-09-10", "status": "NOT_ATTEMPTED" } ] },
"timestamp": "2026-09-24T12:00:00.000Z"
}
}