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_DECLINED ou PAYMENT_FAILED (não 402).

PUT/v1/subscriptions/:subscriptionId/items/:itemId
Base URL Produção:https://api.validapay.com.br
Base URL Sandbox:https://sandbox.validapay.com.br

Authorizations

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

NameTypeRequiredDescription
subscriptionIdstringRequiredID da assinatura (ex: sub_xxx) - required
itemIdstringRequiredID 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

priceIdstringOptional

Pelo menos priceId ou quantity é obrigatório

quantitynumberOptional
dueDatestringOptional
Regra:^\d{4}-\d{2}-\d{2}$

Vencimento do boleto/PIX de pro-rata (YYYY-MM-DD)

boletoInstructionsobjectOptional

Juros, multa e desconto do boleto

expirationAfterDueDatenumberOptional
Regra:0 a 60

Dias 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"
    }
}