Descontos e cupons
Aplicar desconto em uma cobrança
Dá um desconto pontual, de valor livre, em uma cobrança específica — por exemplo, para negociar uma fatura vencida. Não afeta as outras cobranças.
/v1/subscriptions/:subscriptionId/discountshttps://api.validapay.com.brhttps://sandbox.validapay.com.brQual cobrança: informe invoiceId, chargeId ou cycleNumber. Sem nenhum deles, vale para a cobrança atual.
O que acontece com a cobrança: se ela já foi emitida em Pix ou boleto, é reemitida com o valor novo (a menos que reissueOpenCharge seja false). O boleto antigo não é cancelado, a menos que você envie cancelOpenBoleto: true. Para remover um desconto, envie discount: null.
O desconto não pode zerar a cobrança. Para benefícios recorrentes ou período grátis, use Aplicar cupom.
Envie
dryRun: truepara ver o valor novo sem aplicar.
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
{
"cycleNumber": 3,
"discount": {
"type": "PERCENTAGE",
"value": 10
},
"reissueOpenCharge": true,
"cancelOpenBoleto": false,
"reason": "Negociação da fatura",
"dryRun": false
}Schema
discountobjectobrigatóriocycleNumbernumberopcionalreissueOpenChargebooleanopcionalcancelOpenBoletobooleanopcionalreasonstringopcionaldryRunbooleanopcionalconst url = 'https://sandbox.validapay.com.br/v1/subscriptions/:subscriptionId/discounts';
const options = {
method: 'POST',
headers: {
'Authorization': 'Bearer {{token}}',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"cycleNumber": 3,
"discount": {
"type": "PERCENTAGE",
"value": 10
},
"reissueOpenCharge": true,
"cancelOpenBoleto": false,
"reason": "Negociação da fatura",
"dryRun": false
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));Response Examples
200▾
{
"success": true,
"type": "DISCOUNT_APPLIED",
"subscriptionId": "sub_xxx",
"target": {
"kind": "INVOICE",
"cycleNumber": 3,
"invoiceId": "inv_xxx",
"invoiceNumber": "000003",
"isPrimaryInvoice": true
},
"discount": { "type": "PERCENTAGE", "value": 10 },
"previousDiscount": null,
"grossAmount": 99.9,
"discountAmount": 9.99,
"currentAmount": 99.9,
"newAmount": 89.91,
"reissue": {
"willReissue": true,
"skipReason": null,
"paymentType": "BOLETO",
"subscriptionPaymentType": "BOLETO",
"openChargeId": "cha_xxx"
},
"warnings": [],
"reissued": { "chargeId": "cha_yyy", "paymentType": "BOLETO", "dueDate": "2026-10-10", "amount": 89.91 }
}Campos da resposta
successbooleantypestringDISCOUNT_APPLIEDDISCOUNT_REMOVEDNO_CHANGEPREVIEWsubscriptionIdstringtargetobjectdiscountobjectpreviousDiscountobjectgrossAmountnumberdiscountAmountnumbercurrentAmountnumbernewAmountnumberreissueobjectwarningsarray[0]reissuedobject400desconto zera a cobrança▾
{
"error": {
"message": "O desconto não pode zerar a cobrança, hoje em 99.90",
"code": "DISCOUNT_EXCEEDS_CHARGE_AMOUNT",
"details": null,
"timestamp": "2026-09-24T12:00:00.000Z"
}
}