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 · header · required
Cabeçalho de autenticação Bearer no formato Bearer {{token}} onde {{token}} é o seu token OAuth2.
Escopos requeridos
subscriptions/write
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| subscriptionId | string | Required | ID da assinatura (ex: sub_xxx) - required |
| itemId | string | Required | ID do item da assinatura (ex: item_xxx) - required |
Body
application/json
Content-Type:application/json
{
"priceId": "price_yyy",
"quantity": 2,
"dueDate": "2026-04-06",
"boletoInstructions": {
"fine": 2.0,
"interest": 1.0
},
"expirationAfterDueDate": 30
}Schema
priceIdstringOptionalPelo menos priceId ou quantity é obrigatório
quantitynumberOptionaldueDatestringOptionalRegra:
^\d{4}-\d{2}-\d{2}$Vencimento do boleto/PIX de pro-rata (YYYY-MM-DD)
boletoInstructionsobjectOptionalJuros, multa e desconto do boleto
expirationAfterDueDatenumberOptionalRegra:
0 a 60Dias após vencimento (0 a 60, default 30)
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,
"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
{
"success": true,
"type": "UPGRADE",
"chargeId": "cha_xxx",
"prorataAmount": 33.5,
"newAmount": 199.9
}200200 downgrade
{
"success": true,
"type": "DOWNGRADE",
"effectiveAt": "2024-02-01",
"newAmount": 59.9
}400400 pagamento
{
"error": {
"message": "Cartão recusado por saldo insuficiente",
"code": "PAYMENT_DECLINED",
"details": {
"declinedCode": "insufficient_funds"
},
"timestamp": "2026-07-14T21:39:36.322Z"
}
}404404
{
"error": {
"message": "Item não encontrado",
"code": "ITEM_NOT_FOUND",
"details": null,
"timestamp": "2026-07-14T21:39:36.322Z"
}
}