Plano e itens
Trocar plano ou quantidade
Troca o plano de um item (inclusive por um plano de outro produto) ou muda a quantidade.
PUT
/v1/subscriptions/:subscriptionId/items/:itemIdBase URL Produção:
https://api.validapay.com.brBase URL Sandbox:
https://sandbox.validapay.com.brO que acontece com a cobrança:
- Plano mais caro: cobra agora a diferença proporcional aos dias que faltam (pró-rata). O plano novo vale quando essa cobrança é paga.
- Plano mais barato: nada é cobrado agora; o valor novo vale a partir da próxima cobrança. Os dias restantes podem virar crédito nas próximas cobranças.
- Outra periodicidade (ex.: anual para mensal): nada é cobrado agora; o que já foi pago vira dias do plano novo e a próxima cobrança é remarcada.
Quer saber o valor antes? Use Calcular pró-rata ou crédito. Ela faz exatamente o mesmo cálculo desta rota, sem alterar nada.
O formato antigo (
PATCH /v1/subscriptions/{id}comoldenew) continua aceito, mas está descontinuado.
Authorizations
bearer
Authorization
string obrigatório
Cabeçalho de autenticação Bearer no formato Bearer {{token}} onde {{token}} é o seu token OAuth2.
Escopos requeridos
subscriptions/write
Path Parameters
subscriptionIdstringobrigatórioID da assinatura (ex: sub_xxx) - required
itemIdstringobrigatórioID do item da assinatura, em items[].itemId de Ver uma assinatura (ex: item_xxx) - required
Body
application/json
Content-Type:application/json
JSON
{
"priceId": "price_yyy",
"quantity": 2,
"prorata": {
"enabled": true,
"mergeWithNextCycle": false,
"dueDate": "2026-09-27"
},
"boletoInstructions": {
"fine": 2.0,
"interest": 1.0
},
"expirationAfterDueDate": 30,
"dryRun": false
}Schema
priceIdstringopcionalPlano novo. Informe priceId, quantity ou os dois
quantitynumberopcionalQuantidade nova
prorataobjectopcionalComo cobrar a diferença dos dias restantes
boletoInstructionsobjectopcionalMulta, juros e desconto do boleto da pró-rata
expirationAfterDueDatenumberopcionalDias depois do vencimento em que o boleto ou Pix ainda pode ser pago (0 a 60)
Regra:
0 a 60dryRunbooleanopcionaltrue: só simula e não altera nada
const url = 'https://sandbox.validapay.com.br/v1/subscriptions/:subscriptionId/items/:itemId';
const options = {
method: 'PUT',
headers: {
'Authorization': 'Bearer {{token}}',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"priceId": "price_yyy",
"quantity": 2,
"prorata": {
"enabled": true,
"mergeWithNextCycle": false,
"dueDate": "2026-09-27"
},
"boletoInstructions": {
"fine": 2.0,
"interest": 1.0
},
"expirationAfterDueDate": 30,
"dryRun": false
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));Response Examples
200plano trocado▾
JSON
{
"success": true,
"intent": "REPLACE",
"mode": "PRORATA_NOW",
"settlement": "AWAITING_PAYMENT",
"item": {
"itemId": "item_yyy",
"priceId": "price_yyy",
"quantity": 1,
"amount": 149.9,
"status": "PENDING_UPGRADE"
},
"replacedItemId": "item_xxx",
"adjustmentItemId": null,
"amounts": {
"delta": 50.0,
"prorata": 25.0,
"recurringTotal": 149.9,
"chargeTotal": 25.0
},
"prorataPeriod": {
"startDate": "2026-09-24",
"endDate": "2026-10-09",
"days": 15,
"factor": 0.5,
"prorataAmount": 25.0
},
"effectiveAt": "2026-10-10T00:00:00.000Z",
"invoiceId": "inv_yyy",
"charge": {
"chargeId": "cha_yyy",
"status": "AWAITING_PAYMENT",
"paymentType": "PIX",
"dueDate": "2026-09-27"
},
"payment": {
"method": "PIX",
"pix": {
"emv": "00020126...",
"qrCode": "data:image/png;base64,iVBOR...",
"transactionId": "tx_xxx"
},
"boleto": null,
"dueDate": "2026-09-27"
},
"type": "DEFERRED_UPGRADE",
"chargeId": "cha_yyy",
"prorataAmount": 25.0,
"newAmount": 149.9,
"recurringTotal": 149.9,
"amount": 25.0,
"paymentMethod": "PIX",
"pix": { "emv": "00020126...", "qrCode": "data:image/png;base64,iVBOR...", "transactionId": "tx_xxx" },
"dueDate": "2026-09-27"
}Campos da resposta
successbooleantrue quando a alteração foi registrada
intentstringADD: item adicionado. REPLACE: item trocado
Valores aceitos:
ADDREPLACEmodestringComo a diferença de valor foi tratada
Valores aceitos:
PRORATA_NOWNO_PRORATAPRORATA_NEXT_CYCLESCHEDULED_DOWNGRADERECURRENCE_CHANGEPENDING_REWRITEsettlementstringSituação da cobrança da diferença. PAID: paga no cartão. AWAITING_PAYMENT: Pix ou boleto emitido. NEXT_CYCLE_ENGINE: entra na próxima cobrança. CREDITED: virou crédito. RESCHEDULED: próxima cobrança remarcada. NONE: nada a cobrar
Valores aceitos:
PAIDAWAITING_PAYMENTNONENEXT_CYCLE_ENGINEMERGED_INTO_OPEN_CHARGEMERGED_INTO_CHECKOUTCREDITEDRESCHEDULEDitemobjectItem criado ou alterado, no mesmo formato de items[] em Ver uma assinatura
replacedItemIdstringItem substituído. Só na troca
adjustmentItemIdobjectAjuste de pró-rata lançado na próxima cobrança
amountsobjectValores da alteração, em reais
prorataPeriodobjectDias considerados na pró-rata
effectiveAtstringQuando o valor novo passa a valer nas cobranças
invoiceIdstringFatura da cobrança da diferença
chargeobjectCobrança da diferença
paymentobjectComo pagar a cobrança da diferença
typestringResultado no formato antigo. Use mode e settlement
chargeIdstringUse charge.chargeId
prorataAmountnumberUse amounts.prorata
newAmountnumberValor novo do item. Use item.amount
recurringTotalnumberUse amounts.recurringTotal
amountnumberUse amounts.chargeTotal
paymentMethodstringUse payment.method
Valores aceitos:
pixcreditcardboletopix_automaticopixobjectUse payment.pix
dueDatestringUse charge.dueDate
Regra:
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$400pagamento recusado▾
JSON
{
"error": {
"message": "Cartão recusado por saldo insuficiente",
"code": "PAYMENT_DECLINED",
"details": { "declinedCode": "insufficient_funds" },
"timestamp": "2026-09-24T12:00:00.000Z"
}
}404▾
JSON
{
"error": {
"message": "Item não encontrado",
"code": "ITEM_NOT_FOUND",
"details": null,
"timestamp": "2026-09-24T12:00:00.000Z"
}
}