Assinaturas
Atualizar Item
Rota canônica para upgrade ou downgrade de plano. Altera o priceId ou quantity de um item específico.
O subscriptionId e itemId vão na URL. Informe pelo menos priceId ou quantity.
- Upgrade (
newTotal > currentTotal): cobra pro-rata imediatamente (cartão) ou gera boleto/PIX assíncrono. - Downgrade (
newTotal <= currentTotal): efetivado no próximo ciclo, sem cobrança imediata.
Pré-condições: assinatura ACTIVE, PAST_DUE ou AWAITING_PAYMENT; item ACTIVE.
Falha de pagamento retorna 400 com
PAYMENT_DECLINEDouPAYMENT_FAILED(não 402).
PUT
/v1/subscriptions/:subscriptionId/items/:itemIdBase URL Produção:
https://api.validapay.com.brBase URL Sandbox:
https://sandbox.validapay.com.brAuthorizations
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 (ex: item_xxx) - required
Body
application/json
Content-Type:application/json
JSON
{
"priceId": "price_yyy",
"quantity": 2,
"dueDate": "2026-04-06",
"boletoInstructions": {
"fine": 2.0,
"interest": 1.0
},
"expirationAfterDueDate": 30
}Schema
priceIdstringopcionalPelo menos priceId ou quantity é obrigatório
quantitynumberopcionaldueDatestringopcionalVencimento do boleto/PIX de pro-rata (YYYY-MM-DD)
Regra:
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$boletoInstructionsobjectopcionalJuros, multa e desconto do boleto
expirationAfterDueDatenumberopcionalDias após vencimento (0 a 60, default 30)
Regra:
0 a 60const 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,
"dueDate": "2026-04-06",
"boletoInstructions": {
"fine": 2.0,
"interest": 1.0
},
"expirationAfterDueDate": 30
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));Response Examples
200200 upgrade▾
JSON
{
"success": true,
"type": "UPGRADE",
"chargeId": "cha_xxx",
"prorataAmount": 33.5,
"newAmount": 199.9
}200200 downgrade▾
JSON
{
"success": true,
"type": "DOWNGRADE",
"effectiveAt": "2024-02-01",
"newAmount": 59.9
}400400 pagamento▾
JSON
{
"error": {
"message": "Cartão recusado por saldo insuficiente",
"code": "PAYMENT_DECLINED",
"details": {
"declinedCode": "insufficient_funds"
},
"timestamp": "2026-07-14T21:39:36.322Z"
}
}404404▾
JSON
{
"error": {
"message": "Item não encontrado",
"code": "ITEM_NOT_FOUND",
"details": null,
"timestamp": "2026-07-14T21:39:36.322Z"
}
}